2017-10-14 3 views
0

J'ai besoin d'écrire un programme qui peut Ranking course de 10 partants donc j'ai créé 2 tableauxcomment le classement du temps de course

  1. ID de coureurs (10 coureurs)

  2. temps de course de 10 coureurs (temps de course doit être inférieure ou égale à 20,0 s)

et je trouve que mon algorithme de tri ne peut pas être utilisé correctement, je ne veux pas utiliser Arrays.sort(x); parce que je dois trier « les temps de course et ID » voici mon code

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(); 
    } 

} 

et

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

donc je dois savoir pourquoi mon algorithme de tri ne peut pas être utilisé correctement, il est pop une erreur sur ma console.

une question, à l'étage d'entrée quand je première entrée ID et le temps, si je presse comme celui-ci

ID [0] -> ENTR -> temps [0]

alors l'entrée est correct mais si je presse

ID [0] -> Barre d'espace -> temps [0]

alors l'entrée est erroné. Pourquoi? Et comment puis-je le réparer?

+0

Êtes-vous autorisé à utiliser [ 'list'] (https://docs.oracle.com/javase/7/docs/api/ java/util/List.html) et ['Comparable'] (https://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html) comme ils sont faits pour votre question? Si oui, je peux poster une réponse expliquant que – Al1

Répondre

0

La première chose que je vois est que vous passez un tableau de 10 éléments dans le constructeur de Run; ce n'est pas nécessaire, vous pouvez directement passer les tableaux:

En principal:

Run a = new Run(ID, time); 

Dans l'essai:

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

Pouvez-vous poster le journal des erreurs?

Lisez ici le problème à la lecture des entrées: Read integers and strings from a single line of a console

Le problème est que vous essayez d'obtenir dans une cellule de tableau qui n'existe pas: array.length retourne la longueur du tableau, donc dans ce cas renvoie 10.

Vous effectuez un cycle de 0 à 10, puis vous essayez d'obtenir (dans l'instruction if) à l'intérieur time[11] (c'était time[j+1]).

Changez le pour le cycle à:

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 répondu à votre question concernant l'erreur d'index. Pour répondre à votre question sur la raison pour laquelle vous devez entrer une nouvelle ligne (appuyez sur Entrée) après la saisie de l'ID, vous devez numériser toute la ligne dans la valeur ID en utilisant nextLine(). Au lieu d'utiliser nextInt() comme vous l'avez fait pour le temps avec nextDouble().

comme ceci:

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

Découvrez les Java docs pour la classe du scanner ici: https://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html

Et parce que vous numérisez maintenant dans un int, vous devez mettre à jour toutes vos variables d'identité à int. La combinaison avec la réponse de Pleasant94 vous devriez être en mesure de le faire faire:

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