2016-05-01 6 views
0

Ich habe den Testlauf meiner Übung gemacht und der "Der Spieler ist schon im Team" wird 3 Mal vorkommen für welche String-Eingabe auch für variable Newplayer, wenn Option gleich y ist.Was ist falsch in meinem if und sonst Statement?

import java.util.ArrayList; 
import java.util.Scanner; 

public class Players { 
    public static void main(String[] args) { 
     ArrayList<String> players = new ArrayList<>(); 
     players.add("Torres"); 
     players.add("Ronaldo"); 
     players.add("Rooney"); 
     System.out.println("This is the current items in the players \n" + players); 

     Scanner sc = new Scanner(System.in); 

     System.out.println("Do you want to buy more players ???? y/n"); 
     String option = sc.nextLine(); 

     if (option.equalsIgnoreCase("y")) { 

      System.out.println("Please enter your favorite player "); 
      String newplayer = sc.nextLine(); 
      for (int i = 0; i < players.size(); i++) { 
       if (newplayer.equalsIgnoreCase(players.get(i))) { 
        System.out.println("The player is already in the team "); 
       } else { 
        players.add(newplayer); 
       } 
      } 

      System.out.println("New and old players are " + players); 
     } else { 
      System.out.println("The current players we have are " + players); 
     } 

    } 

} 
+0

Oh ist das Problem ... Sec mir eine Lösung erstellen lassen ... Es hat mit der Schleife – DarkV1

+0

Hinweis zu tun: Was, wenn jeder kontrolliert geschieht Person ist nicht gleich neuen Spieler? Tipp2: Also wann sollten wir die Entscheidung treffen, den Spielern etwas hinzuzufügen (ist das in der richtigen Position)? – Pshemo

+0

Genau ... Es fügt die Person hinzu, wenn es nicht gleich Player ist .. auch wenn der Index immer noch 0 ist – DarkV1

Antwort

0

Sie sollten die for-Schleife entfernen um Ihre wenn die als unten:

for (int i = 0; i <players.size() ; i++) {//its because of this loop that if your input is in players list it loops three times and prints "...already in team" 
    if (newplayer.equalsIgnoreCase(players.get(i))){ 
     System.out.println("The player is already in the team "); 
    } else { 
     players.add(newplayer); 
    } 
} 

Hier finden Sie eine Schleife ausgeführt, die dreimal gehen (wie Sie drei Spieler in Ihrer Liste haben). Sie sollten nicht die Schleife fortgesetzt, sobald Sie, dass Spieler finden bereits im Team ist durch die Verwendung Pause in Ihrer Methode wie unten:

for (int i = 0; i <players.size() ; i++) { 
    if (newplayer.equalsIgnoreCase(players.get(i))){ 
     System.out.println("The player is already in the team "); 
     break; 
    } else { 
     players.add(newplayer); 
    } 
} 

Oder noch besser, speichern Sie alle Ihre Spieler in Kleinbuchstaben und dann contains Methode auf Ihre Spielerliste wie:

if (players.contains(newplayer.toLowerCase())) { 
    //player exist 
} else { 
    // add player 
} 
+0

er braucht das für Schleife – DarkV1

+1

Ich denke, er will durch das ganze Team laufen und sehen, ob die Person existiert ... Dann füge den Player hinzu, wenn er nicht existiert – DarkV1

+0

So scheint es, @ DarkV1. –

0

das Problem ist, die sonst Teil Ihrer Aussage

else { 
    players.add(newplayer); 
    } 

, die sonst jeden Index genannt wird, dass (20 läuft durch conditionals.) erfüllt das if nicht. Es muss nur aufgerufen werden, sobald die Schleife durchgeschaltet ist und der Spieler kein Team hat.

Logik/Pseudo-Code: Daher sollte die Else-Anweisung ausgelöst werden, sobald der Index i seinen letzten Lauf beendet ist, wo es die Schleife nicht erfüllt. Wenn also die Schleife durchlaufen wurde und eine break-Anweisung nicht erreicht wurde, bedeutet das, dass der Spieler keine Mannschaft hat. Dann füge den Spieler hinzu.

for (int i = 0; i < players.size(); i++) { 
      if (newplayer.equalsIgnoreCase(players.get(i))) { 
       System.out.println("The player is already in the team "); 
      break; 
      } 
      if(i = players.size()-1&& !newplayer.equalsIgnoreCase(players.get(i)) 
      { 
       //If the loop is iterated through and does not satisfy the first conditional, then that means it will reach this conditional without breaking. Which also means that the player does not have a team 

        players.add(newplayer); 
      } 
     } 
+0

@BoLin die for-Schleife, die ich schrieb, sollte funktionieren – DarkV1

+0

würde es funktionieren, aber es wäre ineffizient: sagen Sie haben 10 Spieler und der neue Player, den Sie hinzufügen möchten, ist nicht bereits in der Liste. Sie werden am Ende 20 Tests durchführen, nur um den neuen Player hinzuzufügen. Nicht zu erwähnen, dass Sie den Test auf den Namen zweimal durchführen –

+0

ja meine ich die 2 if-Anweisungen: sie sind nicht gegenseitig auszuschließen, so dass sie bei jeder Iteration überprüft werden –

0

Extrahieren der Logik der Hinzufügen eines Spieler von den for loop dass überprüft, ob der Spieler bereits vorhanden ist wird den Job erledigen. Es würde Ihnen auch erlauben, die Funktionalität der Suche nach einem Spieler wiederzuverwenden, indem Sie die Logik innerhalb einer separaten Methode einkapseln, und es wäre effizienter, da Sie unnötige if Prüfungen vermeiden könnten.

Versuchen Sie es.

String newplayer = sc.nextLine(); 
boolean playerExists = false; 
for (int i = 0; i < players.size(); i++) { 
    if (newplayer.equalsIgnoreCase(players.get(i))) { 
     playerExists = true; 
     break; 
    } 
} 
if(playerExists){ 
    System.out.println("The player is already in the team "); 
} else { 
    players.add(newplayer); 
} 

oder mit einem separaten Verfahren Ansatz

if(playerExists()){ 
    System.out.println("The player is already in the team "); 
} else { 
    players.add(newplayer); 
} 

// change access modifier and parameters according to your specific scenario... 
private boolean playerExists(String player){ 
    for (int i = 0; i < players.size(); i++) { 
     if (player.equalsIgnoreCase(players.get(i))) { 
      return true; 
     } 
    } 
    return false; 
} 
+0

Die Ausgabe ist die gleiche .. Sie delegiert nur die Verantwortung der Schleife an eine Methode. – DarkV1

+0

@ DarkV1 ja die Ausgabe wird gleich sein, aber es wäre effizienter. Ich habe Ihrer Antwort einen Kommentar hinzugefügt –