2017-10-14 47 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]); 
     } 
    } 
}