【问题标题】:how to ranking of race time比赛时间如何排名
【发布时间】:2017-10-15 00:51:57
【问题描述】:

我需要编写一个程序,可以对 10 名选手的比赛时间进行排名 所以我创建了 2 个数组

  1. 跑步者的 ID(10 名跑步者)

  2. 10名选手的比赛时间(比赛时间必须小于或等于20.0秒)

我发现我的排序算法不能正确使用,我不想使用Arrays.sort(x);,因为我需要对“那些比赛时间和ID”进行排序,这是我的代码

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String[] ID = new String[10];
        double[] time = new double[10];

        for (int i = 0; i < ID.length; i++) {
            System.out.print("Please enter ID and times: ");
            ID[i] = sc.nextLine();
            time[i] = sc.nextDouble();
        }

        Run a = new Run(ID, time);
        System.out.println("Top 3 is ");
        a.Sort();
    }

}

public class Run {
    private String[] ID = new String[10];
    private double[] time = new double[10];
    public Run(String[] ID, double[] time) {
        for (int i = 0; i < ID.length; i++) {
            this.ID[i] = ID[i];
        }
        for (int i = 0; i < time.length; i++) {
            if (time[i] <= 20.0) {
                this.time[i] = time[i];
            }
        }
    }
    public void Sort() {
        double tem1;
        String tem2;

        for (int i = 0; i < time.length; i++) {
            for (int j = 0; j < time.length; j++) {
                if (time[j] > time[j+1]) {
                    tem1 = time[j];
                    time[j] = time[j+1];
                    time[j+1] = tem1;
                    tem2 = ID[j];
                    ID[j] = ID[j+1];
                    ID[j+1] = tem2;
                }
            }
        }
        for (int i = 0; i < 3; i++) {
            System.out.println(ID[i] + " " + time[i]);
        }
    }
}

所以我需要知道为什么我的排序算法不能正确使用,它在我的控制台上弹出一个错误。

还有一个问题,在输入阶段,当我输入第一个ID和时间时,如果我这样按

ID[0] -> 输入 -> 时间[0]

那么输入是正确的,但如果我按下

ID[0] -> 空格键 -> 时间[0]

那么输入错误。 为什么?我该如何解决?

【问题讨论】:

  • 您是否可以使用ListComparable,因为它们是为您的问题而设计的?如果是,我可以发布一个答案来解释

标签: java arrays algorithm sorting


【解决方案1】:

我看到的第一件事是您在Run 的构造函数中传递了一个包含10 个元素的数组;这不是必须的,你可以直接传递数组:

主要:

Run a = new Run(ID, time);

运行中:

public Run(String[] ID, double[] time) {
    this.ID = ID;
    this.time = time;
}

你能发布错误日志吗?

在此处阅读有关读取输入的问题:Read integers and strings from a single line of a console

问题是您试图进入一个不存在的数组单元格:array.length 返回数组的长度,所以在这种情况下返回 10。

您正在执行从 0 到 10 的 for 循环,然后您试图(在 if 语句中)进入 time[11](它是 time[j+1])。

将for循环改为:

    for (int i = 0; i < time.length - 1; i++) {
        for (int j = 0; j < time.length - 1; j++) {
            System.out.println(i + " "+ j);
            if (time[j] > time[j+1]) {
                tem1 = time[j];
                time[j] = time[j+1];
                time[j+1] = tem1;
                tem2 = ID[j];
                ID[j] = ID[j+1];
                ID[j+1] = tem2;
            }
        }
    }

【讨论】:

    【解决方案2】:

    @Pleasant94 回答了您关于索引错误的问题。 要回答您关于为什么在输入 ID 后需要输入新行(按 Enter)的问题,是因为您正在使用 nextLine() 将整行扫描到 ID 值中。而不是像您使用nextDouble() 那样使用nextInt()

    像这样:

        ...
        ID[i] = sc.nextInt();
        time[i] = sc.nextDouble();
        ...
    

    在此处查看扫描仪类的 Java 文档:https://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html

    因为您现在扫描的是 int,所以您必须将所有 ID 变量更新为 int。将它与 Pleasant94 的答案结合起来,您应该能够做到这一点:

    import java.util.Scanner;
    
    public class Main {
    
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            int[] ID = new int[10];
            double[] time = new double[10];
    
            for (int i = 0; i < ID.length; i++) {
                System.out.print("Please enter ID and times: ");
                ID[i] = sc.nextInt();
                time[i] = sc.nextDouble();
            }
    
            Run a = new Run(ID, time);
            System.out.println("Top 3 is ");
            a.Sort();
        }
    
    }
    
    class Run {
        private int[] ID = new int[10];
        private double[] time = new double[10];
        public Run(int[] ID, double[] time) {
            for (int i = 0; i < ID.length; i++) {
                this.ID[i] = ID[i];
            }
            for (int i = 0; i < time.length; i++) {
                if (time[i] <= 20.0) {
                    this.time[i] = time[i];
                }
            }
        }
        public void Sort() {
            double tem1;
            int tem2;
    
            for (int i = 0; i < time.length - 1; i++) {
                for (int j = 0; j < time.length - 1; j++) {
                    if (time[j] > time[j+1]) {
                        tem1 = time[j];
                        time[j] = time[j+1];
                        time[j+1] = tem1;
                        tem2 = ID[j];
                        ID[j] = ID[j+1];
                        ID[j+1] = tem2;
                    }
                }
            }
            for (int i = 0; i < 3; i++) {
                System.out.println(ID[i] + " " + time[i]);
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-19
      • 2019-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多