2012-12-28 3 views
1

Je suis complètement nouveau à Java et j'ai commencé avec quelques applications de console simples.Alors que la boucle ne se termine pas

Ceci est mon actuel code de l'application:

Scanner sc = new Scanner(System.in); 
boolean ExitLoop = false; 
ArrayList<Integer> IDs = new ArrayList<Integer>(); 
ArrayList<Double> averages = new ArrayList<Double>(); 
while(!ExitLoop) 
{ 
    System.out.println("StudentID: "); 
    IDs.add(sc.nextInt()); 
    System.out.println("Average: "); 
    averages.add(sc.nextDouble()); 
    System.out.println("Do you want to register another student? [y/n] "); 
    ExitLoop = (sc.next() == "n"); 
} 

Désolé de poser une telle question idiote, mais je suis vraiment coincé dans ce domaine, je frappe « n », mais la boucle while ne cesse pas, et continue à travailler. Ai-je fait quelque chose de mal? que dois-je faire pour terminer la boucle lorsque l'utilisateur entre «n» signifiant non?

+3

FYI, 'faites {...} while (! Sc.next().equals ("n")); 'est une construction directe pour ce que vous essayez de faire, plutôt que d'avoir besoin du drapeau' ExitLoop'. –

+2

comme convention commencer votre variable-Noms avec un minuscule: 'exitLoop' et' ids'. Sinon, quelqu'un pourrait penser que ce sont des cours. – Simulant

+0

+1 @MarkPeters bonne opinion, votre solution mérite d'être la réponse. Ajoutez-le comme une réponse pour que je puisse l'accepter. –

Répondre

10

Une question est:

sc.next() == "n" 

devrait être

sc.next().equals("n") 

comparaison String doit utiliser equals() au lieu de == (sauf comparaison pour les chaînes littérale) et il est toujours préférable de suivre java code conventions.

+2

Pour le bénéfice OP: http: //stackoverflow.com/questions/767372/java-string-equals-versus – NominSim

+0

Merci vous beaucoup. +1 –

+0

@mahditahsildari: vous êtes les bienvenus. Bonne chance! – kosa

3

Modifier à

sc.next().equals("n") 

en dehors de cette convention de codage java vérification, nom de la variable suit chameau cas

2

Essayez cette

Scanner sc = new Scanner(System.in); 
      boolean ExitLoop = false; 
      ArrayList<Integer> IDs = new ArrayList<Integer>(); 
      ArrayList<Double> averages = new ArrayList<Double>(); 
      while(!ExitLoop) 
      { 
       System.out.println("StudentID: "); 
       IDs.add(sc.nextInt()); 
       System.out.println("Average: "); 
       averages.add(sc.nextDouble()); 
       System.out.println("Do you want to register another student? [y/n] "); 
       if(sc.next().equals("n")){ 
         ExitLoop = true; 
       } 
      } 

Notez également que java, si vous voulez comparez Strings par leurs valeurs utilisez le .equals("somevaluhere") si vous voulez comparer leur référence ==

+2

Pourquoi auriez-vous besoin d'un opérateur ternaire sur une expression booléenne dont le résultat est assigné à une variable booléenne? C'est au-delà de redondant. –

+0

Pourquoi pas? – KyelJmD

+0

là j'ai mis à jour ma réponse. – KyelJmD

0

Vous voulez sortir de la boucle si l'utilisateur répond « n » vous devriez donc il suffit d'écrire

ExitLoop=sc.next().equals("n"); 

et garder à l'esprit que l'utilisateur peut répondre à « N ». La méthode ci-dessus renvoie une valeur booléenne pour une variable booléenne, donc vous êtes OK et votre code est aussi simple que possible.

1

Je serais prudent en utilisant le .equals ("n") principalement parce qu'il compare la chaîne entière. Que faire si l'utilisateur a tapé le mot entier "non"? Cela entraînerait également une continuation de la boucle. Il n'y a rien de mal à utiliser l'opérateur == que vous utilisiez auparavant, vous devez juste vous assurer de ce qu'il compare. Cela fonctionne très bien pour char, pas tellement pour char vs String ou String vs String. Pour moi, une meilleure mise en œuvre serait:

exitLoop = sc.next().charAt(0) == 'n'; 

ou mieux encore:

exitLoop = (sc.next().charAt(0) == 'n' || sc.next().charAt(0) == 'N'); 

De plus, maintenant serait un bon moment pour commencer déterminer la validation d'entrée.

Et n'oubliez pas de fermer le scanner.

0

Ceci vérifie si la chaîne d'entrée commence par n ExitLoop = sc.next(). ToLowerCase(). StartsWith ("n"); // ou vous pouvez essayer d'ignorer le cas en faisant ExitLoop = sc.next(). ToLowerCase(). Equals ("n");

Questions connexes