Java 通过输入与数据关联的名称查找数据

Java 通过输入与数据关联的名称查找数据,java,arrays,sorting,Java,Arrays,Sorting,我正在为跑步者开发一个简单的统计程序。它只接受一场比赛的数据。在stackoverflow的帮助下,我运行了第一部分的代码! 我们的想法是,在比赛结束后,我们可以输入跑步者的姓名和时间。然后我希望通过搜索一个人的名字来搜索他的跑步时间(然后你会看到跑步者的名字和他们的时间显示在屏幕上。有没有可能用Java来实现这一点?)谢谢Cassy 这是我的密码 import java.util.Scanner; public class Trying { public static void main

我正在为跑步者开发一个简单的统计程序。它只接受一场比赛的数据。在stackoverflow的帮助下,我运行了第一部分的代码! 我们的想法是,在比赛结束后,我们可以输入跑步者的姓名和时间。然后我希望通过搜索一个人的名字来搜索他的跑步时间(然后你会看到跑步者的名字和他们的时间显示在屏幕上。有没有可能用Java来实现这一点?)谢谢Cassy

这是我的密码

import java.util.Scanner;


public class Trying
{

public static void main (String[] args)

    {
    int num;

    Scanner input= new Scanner (System.in);

    System.out.println("******************************************************************* ");
    System.out.println("Welcome to Running Race Time Statistical Analysis Application");
    System.out.println("******************************************************************* \n");


    System.out.println("Please input number of participants (2 to 10)");

    num=input.nextInt();

    // If the user enters an invalid number... display error message...
    while(num<2|| num >10)
    {
        System.out.println("Error invalid input! Try again! \nPlease input a valid number of participants (2-10)...");

        num=input.nextInt();
    }

    // declare arrays
    double resultArray [] = new double [num]; // create result array with new operator
    String nameArray [] = new String [num];// create name array with new operator
    // Using the num int will ensure that the array holds the number of elements inputed by user


    // loop to take in user input for both arrays (name and result)
    double count = 0;
    for (int i = 0 ; i < nameArray.length ; i++)
        {
            System.out.println ("Please enter a race participant Name for runner " + (i+1) );
            nameArray[i] = input.next();

            System.out.println ("Please enter a race result (time between 0.00 and 10.00) for runner " + (i+1) );
            resultArray[i] = input.nextDouble();

            count += resultArray[i]; // This count variable is used later to calculate average from total
        }
}
}
import java.util.Scanner;
公开课
{
公共静态void main(字符串[]args)
{
int-num;
扫描仪输入=新扫描仪(System.in);
System.out.println(“*******************************************************************************************************************”);
System.out.println(“欢迎使用跑步比赛时间统计分析应用程序”);
System.out.println(“******************************************************************************************************************************\n”);
System.out.println(“请输入参与者人数(2至10)”;
num=input.nextInt();
//如果用户输入的号码无效…显示错误消息。。。
while(num10)
{
System.out.println(“错误无效输入!重试!\n请输入有效的参与者人数(2-10)…”;
num=input.nextInt();
}
//声明数组
double-resultArray[]=new-double[num];//使用新运算符创建结果数组
字符串名称数组[]=新字符串[num];//使用新运算符创建名称数组
//使用numint将确保数组保存用户输入的元素数
//循环以接收两个数组的用户输入(名称和结果)
重复计数=0;
for(int i=0;i
如果您只希望用户能够搜索名称,请使用以下方法:

String entered;
while(true) {
    entered = input.nextLine();
    if(entered.equalsIgnoreCase("exit")) break;
    for(int i = 0; i < nameArray.length; i++) {
        if(entered.equals(nameArray[i])) {
            System.out.println("Name: " + nameArray[i] + "\tTime: " + resultArray[i]);
        }
    }
}
输入的字符串;
while(true){
entered=input.nextLine();
如果(输入。相等信号情况(“退出”))中断;
for(int i=0;i
实现查找的最简单方法是使用
哈希映射
或其他类型的
映射
。它的执行效率也比一对数组更高。诀窍是在
哈希映射
中存储所有姓名和时间,代码如下所示

Map<String, Double> raceTimes = new HashMap<>();

for (int i = 1; i <= participants; i++) {
    // ... some code here to enter the name and the time

    raceTimes.put(name, time);
}
Double time = raceTimes.get(nameEntered);
if (time != null) {
    System.out.println(nameEntered + " has a time of " + time);
} 
如果用户输入的名称与其中一个参与者不对应,则会进行空检查。实际查找只是一个表达式
raceTimes.get(nameintered)
-这比使用两个数组循环查找所需的值要简单得多

我冒昧地将所有这些结合在一起,为您提供了一个完整的解决方案。您可以看到,我还改变了其他一些事情

  • 我将其分解为不同的方法,因为
    main
    的长度越来越长
  • 我已将提示参与者姓名的提示更改为使用
    nextLine
    ,因为
    next
    只读取一个单词。这将使参与者的姓名由多个单词组成。但除了此更改之外,我还必须在调用
    nextLine
    nextDouble之后添加一个额外的调用
    nextLine
    de>,因为对
    nextLine
    nextDouble
    的调用不会读取数字后面的换行符-因此您需要额外的
    nextLine
    来读取换行符
我的全部代码如下

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class RaceTimes{

    public static void main(String[] args){
        Scanner input = new Scanner(System.in);

        System.out.println("******************************************************************* ");
        System.out.println("Welcome to Running Race Time Statistical Analysis Application");
        System.out.println("******************************************************************* \n");

        int participants = enterNumberOfParticipants(input);
        Map<String, Double> raceTimes = enterTimes(input, participants);
        lookupTimes(input, raceTimes);
        input.close();
    }

    private static int enterNumberOfParticipants(Scanner input) {
        System.out.println("Please input number of participants (2 to 10)");
        int num = input.nextInt();

        while (num < 2 || num > 10) {
            System.out.println("Error invalid input! Try again! \nPlease input a valid number of participants (2-10)...");
            num = input.nextInt();
        }
        input.nextLine();
        return num;
    }

    private static Map<String, Double> enterTimes(Scanner input, int participants) {
        Map<String, Double> raceTimes = new HashMap<>();

        // loop to take in user input for both arrays (name and result)
        double totalTime = 0;
        for (int i = 1; i <= participants; i++) {
            System.out.println("Please enter a race participant Name for runner " + i);
            String name = input.nextLine();

            System.out.println("Please enter a race result (time between 0.00 and 10.00) for runner " + i);
            Double time = input.nextDouble();
            input.nextLine();
            totalTime += time;

            raceTimes.put(name, time);
        }
        System.out.println("Average time is " + totalTime / participants);
        return raceTimes;
    }

    private static void lookupTimes(Scanner input, Map<String, Double> raceTimes) {
        while(true) {
            System.out.println("Please enter a name that you'd like to know the time for, or type quit.");
            String nameEntered = input.nextLine();
            if(nameEntered.equalsIgnoreCase("quit")) {
                return;
            }
            Double time = raceTimes.get(nameEntered);
            if (time != null) {
                System.out.println(nameEntered + " has a time of " + time);
            } else {
                System.out.println("There is no participant called " + nameEntered);
            }
        }
    }
}
import java.util.HashMap;
导入java.util.Map;
导入java.util.Scanner;
公务舱赛马时间{
公共静态void main(字符串[]args){
扫描仪输入=新扫描仪(System.in);
System.out.println(“*******************************************************************************************************************”);
System.out.println(“欢迎使用跑步比赛时间统计分析应用程序”);
System.out.println(“******************************************************************************************************************************\n”);
int参与者=输入NumberOfParticipants(输入);
地图比赛时间=输入时间(输入,参与者);
查找时间(输入、比赛时间);
input.close();
}
私有静态int enterNumberOfParticipants(扫描仪输入){
System.out.println(“请输入参与者人数(2至10)”;
int num=input.nextInt();
而(num<2 | | num>10){
System.out.println(“错误无效输入!重试!\n请输入有效的参与者人数(2-10)…”;
num=input.nextInt();
}
input.nextLine();
返回num;
}
专用静态地图输入时间(扫描仪输入,整数参与者){
Map raceTimes=new HashMap();
//循环以接收两个数组的用户输入(名称和结果)
双倍总时间=0;

对于(int i=1;i是的,这是可能的,并且您的代码看起来大体上是可行的。但是,请注意,这种“并行数组”设计强烈地表明,您应该使用一个带有字段
name
result
的类
Runner
,以及一个数组(或者更好的是,
List
)关于
Runner
对象。它本质上是一个按名称搜索的功能,我希望实现它。谢谢chrylis,但我不知道如何实现它!只是在这里发展我的Java技能!它们目前非常基本,但希望能快速学习!这里最简单的方法是将名称和时间存储在