2016-06-17 9 views
-2

Ich kann nicht für das Leben von mir herauszufinden, warum dieser Code unbegrenzt endlos, wenn "TurnOrder" auf "zuerst" festgelegt ist. Es scheint etwas über den Operator "oder" in der "Do While-Schleife" zu sein. Aber ich habe keine Ahnung, wie man es richtig formatiert.String-Vergleich (mit "oder" in einer "Do While-Schleife") Java

String turnOrder; 
    do { 
     Scanner to = new Scanner(System.in); 
     turnOrder = to.nextLine(); 
     if ((!"first".equalsIgnoreCase(turnOrder)) || (!"second".equalsIgnoreCase(turnOrder))) { 
      System.out.println("Type your answer as 'first' or 'second.' Without the punctuation."); 
     } else {} 
    } while ((!"first".equalsIgnoreCase(turnOrder)) || (!"second".equalsIgnoreCase(turnOrder))); 
+2

Nun ... es ist nicht 'equalsIgnoreCase'' "second" '. –

+0

Ich dachte mit und "oder" Operator eine der Statements könnte falsch sein, und der Ausdruck als Ganzes wäre wahr – Calvin

+0

Sie sollten immer Ihre logischen Operationen auf ihre einfachste Form reduzieren. – Adam

Antwort

0

Es Ursache Schleifen, wenn Sie "ersten" eingeben, gibt es falsch in ! "Ersten" .equalsIgnoreCase (turnOrder), aber es true zurück in ! "Zweiten". equalsIgnoreCase (turnOrder))

falsch oder wahr = true, so wird es halten Looping

+0

Vielen Dank! Ich kann sehen, dass der Operator "oder" hier leider nicht hilfreich ist. Haben Sie irgendwelche kompakten Lösungen, die ich vielleicht übersehen habe? – Calvin

+0

Was soll das Programm tun? – Daniel

+0

Der Code sollte eine Schleife durchlaufen, bis "turnOrder" entweder "first" oder "second" ist, und weiterlaufen lassen, wenn es etwas anderes ist. Verwenden von && anstelle von || scheint das Problem behoben zu haben. Vielen Dank. – Calvin

0

while ((!"first".equalsIgnoreCase(turnOrder)) || (!"second".equalsIgnoreCase(turnOrder)))

Diese Aussage immer wahr sein, bis Sie mit einem turnOrder Wert kommen, die gleichzeitig und „zweite“ equalsIgnoreCase-s auf „first“. Viel Glück damit! Vielleicht bedeuten Du ...

while (
    !(
     "first".equalsIgnoreCase(turnOrder) || 
     "second".equalsIgnoreCase(turnOrder) 
    ) 
) 
+0

Ja, das wäre in der Tat eine interessante Aussage. Aber selbst mit Ihrer saubereren Herangehensweise bleibt es in der Schleife. – Calvin

+0

Oh, ich verstehe was du jetzt versuchst zu tun. Sie versuchen zu loopen, bis Sie "zuerst" oder "zweite" erhalten, nicht bis Sie etwas anderes erhalten. Hoppla! Ich passe meine Antwort an Ihre tatsächliche Absicht an. – nasukkin

0

Sie sollten immer Ihre logischen Operationen zu ihrer einfachsten Form reduzieren.

"((" first ".equalsIgnoreCase (turnOrder)) || ("zweite" .equalsIgnoreCase (turnOrder)))"

können mit De Morgan Gesetze zu

vereinfacht werden! ("erste" .equalsIgnoreCase (turnOrder) & & "zweite" .equalsIgnoreCase (turnOrder))

natürlich turnOrder kann nicht sein "erster" und "zweiter" gleichzeitig. Es wird immer als wahr ausgewertet, daher wird Ihre while-Schleife unbegrenzt wiederholt.

+0

Richtig, der "oder" Operator wird hier nicht funktionieren. Vielen Dank. – Calvin

Verwandte Themen