Java–;对于循环isn';无法通过数组正确执行

Java–;对于循环isn';无法通过数组正确执行,java,arrays,Java,Arrays,我有两个数组,一个是一个字符串数组,里面装满了马拉松运动员,另一个是一个整数数组,里面装满了马拉松运动员各自的时间。我试图输出最快的跑步者+他/她的时间,以及第二快的跑步者+他/她的时间。到目前为止,我已经能够输出最快的跑步者和他的时间,但是当我尝试输出第二快的跑步者+她的时间时,循环输出两个跑步者的时间,而不是一个。我已附上代码以供参考: 此外,还欢迎就简化/改进代码提出任何意见 public class APCS { public static void main(String[] ar

我有两个数组,一个是一个字符串数组,里面装满了马拉松运动员,另一个是一个整数数组,里面装满了马拉松运动员各自的时间。我试图输出最快的跑步者+他/她的时间,以及第二快的跑步者+他/她的时间。到目前为止,我已经能够输出最快的跑步者和他的时间,但是当我尝试输出第二快的跑步者+她的时间时,循环输出两个跑步者的时间,而不是一个。我已附上代码以供参考:

此外,还欢迎就简化/改进代码提出任何意见

public class APCS {
  public static void main(String[] arguments) {

    String[] names = {
        "Elena", "Thomas", "Hamilton", "Suzie", "Phil", "Matt", "Alex",
        "Emma", "John", "James", "Jane", "Emily", "Daniel", "Neda",
        "Aaron", "Kate"
    };

    int[] times = {
        341, 273, 278, 329, 445, 402, 388, 275, 243, 334, 412, 393, 299,
        343, 317, 265
    };

    int timeIndex = 0;
    int secondTimeIndex = 0;
    for (int i = 0; i < times.length; i++) {
        if (times[i] > times[timeIndex]) {
            timeIndex = i;
            System.out.println(names[timeIndex] + " " + times[timeIndex]);
        }

        if (times[i] > times[secondTimeIndex]) {
            if (times[i] == times[timeIndex]) {
                continue;
            }
            secondTimeIndex = i;
            System.out.println(names[secondTimeIndex] + " " + times[secondTimeIndex]);
        }
    }

  }
}

您的System.out.println位置错误,现在正在报告所需索引中的更改,而不是最终结果。for循环完成后,应调用printlns

for (int i = 0; i < times.length; i++) {
    if (times[i] > times[timeIndex]) {
        timeIndex = i;
        //System.out.println(names[timeIndex] + " " + times[timeIndex]);
    }

    if (times[i] > times[secondTimeIndex]) {
        if (times[i] == times[timeIndex]) {
            continue;
        }
        secondTimeIndex = i;
        //System.out.println(names[secondTimeIndex] + " " + times[secondTimeIndex]);
    }
}
System.out.println("Fastest: " + names[timeIndex] + " " + times[timeIndex]);
System.out.println("Second: " + names[secondTimeIndex] + " " + times[secondTimeIndex]);
for(int i=0;itimes[timeIndex]){
时间指数=i;
//System.out.println(名称[时间索引]+“”+时间[时间索引]);
}
if(次[i]>次[secondTimeIndex]){
if(次[i]==次[timeIndex]){
继续;
}
第二时间指数=i;
//System.out.println(名称[secondTimeIndex]+“”+times[secondTimeIndex]);
}
}
System.out.println(“最快:”+名称[timeIndex]+“”+次数[timeIndex]);
System.out.println(“第二个:“+名称[secondTimeIndex]+”+次[secondTimeIndex]);

您的System.out.println位置错误,现在正在报告所需索引中的更改,而不是最终结果。for循环完成后,应调用printlns

for (int i = 0; i < times.length; i++) {
    if (times[i] > times[timeIndex]) {
        timeIndex = i;
        //System.out.println(names[timeIndex] + " " + times[timeIndex]);
    }

    if (times[i] > times[secondTimeIndex]) {
        if (times[i] == times[timeIndex]) {
            continue;
        }
        secondTimeIndex = i;
        //System.out.println(names[secondTimeIndex] + " " + times[secondTimeIndex]);
    }
}
System.out.println("Fastest: " + names[timeIndex] + " " + times[timeIndex]);
System.out.println("Second: " + names[secondTimeIndex] + " " + times[secondTimeIndex]);
for(int i=0;itimes[timeIndex]){
时间指数=i;
//System.out.println(名称[时间索引]+“”+时间[时间索引]);
}
if(次[i]>次[secondTimeIndex]){
if(次[i]==次[timeIndex]){
继续;
}
第二时间指数=i;
//System.out.println(名称[secondTimeIndex]+“”+times[secondTimeIndex]);
}
}
System.out.println(“最快:”+名称[timeIndex]+“”+次数[timeIndex]);
System.out.println(“第二个:“+名称[secondTimeIndex]+”+次[secondTimeIndex]);

因为这是用Java编写的,所以不应该使用并行数组。Java是专门为面向对象而设计的,因此我建议使用对象来表示马拉松赛跑者

例如,您可以这样声明一个Runner类:

public class Runner implements Comparable<Runner> {
    private String name = null;
    private int time = 0;

    public Runner(String name, int time) {
        this.name = name;
        this.time = time;
    }

    public String toString() {
        return name + " " + time;
    }

    public int compareTo(Runner r) {
        return (r.time - time);
    }
}

因为这是用Java编写的,所以不应该使用并行数组。Java是专门为面向对象而设计的,因此我建议使用对象来表示马拉松赛跑者

例如,您可以这样声明一个Runner类:

public class Runner implements Comparable<Runner> {
    private String name = null;
    private int time = 0;

    public Runner(String name, int time) {
        this.name = name;
        this.time = time;
    }

    public String toString() {
        return name + " " + time;
    }

    public int compareTo(Runner r) {
        return (r.time - time);
    }
}

我会考虑使用一个可以简化代码的MAP。SortedMap可能对您非常有用。@James:或者,
类运行程序实现可比较的
类型类,该类保存字符串名称和int时间字段,然后对数组或列表进行排序。或者更好的方法是使用
比较器
.CS101:由于您输出的是固定数量的数据(正好是2个,而不是每个人的数据),因此输出语句需要在循环之外。您打印出的是迄今为止发现的最快运行速度,您应该打印出最快的运行速度,在循环运行之后,我会考虑使用一个可以简化代码的MAP。SortedMap可能对您非常有用。@James:或者,
类运行程序实现可比较的
类型类,该类保存字符串名称和int时间字段,然后对数组或列表进行排序。或者更好的方法是,使用
比较器
。CS101:由于您要输出固定数量的数据(正好是2个,而不是每个人的数据),输出语句需要在循环之外。您要打印出目前为止发现的快速运行,您应该在循环运行之后打印出所有运行最快的语句。
System.out.println(runners[i].toString())
需要修复“需要修复”是什么意思?
System.out.println(runners[i].toString())
需要修复“需要修复”是什么意思?在我看来,这段代码似乎有两个bug,它们是原始代码的一部分。首先,reqs正在寻找最快的时间(根据问题),哪一个应该是最低时间,而不是最大时间,对吗?第二,如果第二个最快时间出现在列表中最快时间之前,那么它将被跳过,并且永远不会将其索引注册到第二个时间索引中。在我看来,这段代码似乎有两个错误,它们是原始代码的一部分。首先,reqs正在寻找最快的时间e(根据问题),哪一个应该是最低时间,而不是最大时间,对吗?第二,如果第二个最快时间出现在列表中最快时间之前,那么它将被跳过,并且永远不会将其索引注册到secondTimeIndex中。