如何对比赛时间进行排名

时间:2017-10-14 14:56:14

标签: java arrays algorithm sorting

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

  1. 跑步者的身份证(10名跑步者)

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

  3. 我发现我的排序算法无法正确使用,我不想使用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] - &gt;输入 - &gt;时间[0]

    然后输入正确但是如果我按

    ID [0] - &gt;空格键 - &gt;时间[0]

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

2 个答案:

答案 0 :(得分:0)

我看到的第一件事是你在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的循环,然后你试图在time[11]内(在time[j+1]内)(在 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; } } } 中)。

将for循环更改为:

getNoBackupFilesDir

答案 1 :(得分:0)

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

像这样:

    ...
    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]);
        }
    }
}