2017-10-14 49 views
0

我需要写所以我创建2个阵列如何的比赛时间,排名

跑者
  1. ID(10个浇道)

  2. 的比赛时间,可以排名的比赛时间的10名跑步者 的程序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]

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

+0

你允许使用['List'](https://docs.oracle.com/javase/7/docs/api/ java/util/List.html)和['Comparable'](https://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html),因为它们是针对您的问题制定的?如果是的话,我可以发表解释的答案 – Al1

回答

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])内获得(在if语句中)。

更改为周期:

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; 
      } 
     } 
    } 
0

@ Pleasant94回答您的有关指标差的问题。 要输入ID后回答你为什么需要输入新行(按回车)的问题是因为您正在使用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]); 
     } 
    } 
}