2017-09-26 13 views
1

Ich scanne eine Argumentdatei mit einem Schalter Fall in eine Stack und es überspringt Werte mit einem .nextDouble Befehl?Java Scanner nextDouble-Befehl überspringt Werte mit Switch Case?

Hier ist mein Code-Fragment:

while (stackScanner.hasNextLine()) {   

    switch(stackScanner.next()) { 

    case"+": { 
     operator= new operationNode("+"); 
     stack.push(operator);} 

    case"-":{ 
     operator= new operationNode("-"); 
     stack.push(operator);} 

    case"*":{ 
     operator= new operationNode("*"); 
     stack.push(operator);} 

    case"/":{ 
     operator= new operationNode("/"); 
     stack.push(operator);} 

    case"^":{ 
     operator= new operationNode("^"); 
     stack.push(operator);} 

    while(stackScanner.hasNextDouble()) { 
     stack.push(new numberNode(stackScanner.nextDouble())); 
    } 
} 

Das Problem in diesem letzten Zeile ist hier, wo das Argument Datei folgendes enthält: ^ 2 - 3/2 6 * 8 + 2.5 3

Doch der Scanner nur sammelt: ^ 2 - 3/6 * 8 + 3.

So überspringt es die ersten Zahlen, die in einem Paar kommen (2 und 2.5).

Sache ist, wenn ich stackScanner.next(); am Ende der while-Schleife hinzufügen, die nur Zahlen, dass es speichert die Werte 2 und 2,5 sind?

+0

Haben Sie bemerkt, dass Sie keine Pause in Ihren Fällen haben, und dass Ihre while-Schleife in der switch-Anweisung ist? –

+0

@MauricePerry Ich hatte es als Standard: aber es wurde nicht bestimmte Werte gelesen. Auch Pausen scheinen mein Ergebnis nicht zu beeinflussen (?) – Gege

+0

Sind Sie sicher, dass Sie den richtigen Code gepostet haben? Wenn ich es kopiere und einfüge, sehe ich nicht die Ergebnisse, die du sagst. Insbesondere sieht mein Stack so aus: '[^, 2.0, -, *, /, ^, 3.0, /, ^, 2.0, 6.0, *, /, ^, 8.0, +, -, *, /, ^, 2.5, 3.0] ', was im Einklang mit der Beobachtung von MauricePerry steht, dass" Break "-Sätze fehlen. – DaveyDaveDave

Antwort

1

Kopieren Sie den Code und die Änderung leicht ein Stack<String> eher zu verwenden als Ihre operationNode und numberNode Klassen Umsetzung finde ich, dass die folgenden Werke als (glaube ich) Sie erwarten:

public static void main(String... args) { 
    Scanner stackScanner = new Scanner("^ 2 - 3/2 6 * 8 + 2.5 3"); 

    Stack<String> stack = new Stack<>(); 

    while (stackScanner.hasNextLine()) { 

     switch (stackScanner.next()) { 
      case "+": { 
       stack.push("+"); 
       break; 
      } 

      case "-": { 
       stack.push("-"); 
       break; 
      } 

      case "*": { 
       stack.push("*"); 
       break; 
      } 

      case "/": { 
       stack.push("/"); 
       break; 
      } 

      case "^": { 
       stack.push("^"); 
       break; 
      } 
     } 

     while (stackScanner.hasNextDouble()) { 
      stack.push(Double.toString(stackScanner.nextDouble())); 
     } 
    } 

    System.out.println(stack); 
} 

Das heißt, ich habe hinzugefügt die break; Anweisungen, die Sie nicht benötigen (vielleicht eine Art von JVM Unterschied?) und bewegte die while Schleife außerhalb der switch.

0

Sie müssen switch in while wickeln und den Umgang mit double in default Block bewegen, z.B .:

while (stackScanner.hasNextLine()) { 
    String nextToken = stackScanner.next(); 
    switch(nextToken) { 

    case"+": { 
     System.out.println("+"); 
     break; 
     } 

    case"-":{ 
     System.out.println("-"); 
     break; 
    } 

    case"*":{ 
     System.out.println("*"); 
     break; 
    } 

    case"/":{ 
     System.out.println("/"); 
     break; 
    } 

    case"^":{ 
     System.out.println("^"); 
     break; 
    } 

    default: 
     if(isDouble(nextToken)){ 
      //Do something 
     } 
     break; 
    } 
} 

Sie müssen auch ein Verfahren schreiben für double zu überprüfen. Es würde ungefähr so ​​aussehen:

private boolean isDouble(String number){ 
    try{ 
     Double.parseDouble(number); 
     return true; 
    }Catch(Exception e){ 
     return false; 
    } 
} 
+0

Sorry - ich glaube nicht das ist eigentlich richtig. Dies wird nur ein einzelnes Token pro Zeile verarbeiten. Wenn die Eingabe eine einzelne Zeile ist - "^ 2 - 3/2 6 * 8 + 2.5 3", verarbeitet sie das "^" und stoppt dann. – DaveyDaveDave