2017-09-26 4 views
1

Je suis en train de balayer un fichier d'arguments avec un commutateur dans un Stack et il ignore des valeurs avec une commande .nextDouble?Java Scanner nextDouble commande ignorer les valeurs avec le cas de commutateur?

Voici mon fragment de code:

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

Le problème est dans cette dernière ligne ici, où le fichier argument contient les éléments suivants: ^ 2 - 3/2 6 * 8 + 2.5 3

Cependant, le scanner ne recueille que: ^ 2 - 3/6 * 8 + 3.

Donc, il saute les premiers nombres qui viennent dans une paire ici (2 et 2.5).

Cela est, quand j'ajoute stackScanner.next(); à la fin de la boucle while, les seuls chiffres qu'elle enregistre sont les valeurs 2 et 2.5?

+0

Avez-vous remarqué que vous n'avez aucune pause dans vos cas, et que votre boucle while est dans l'instruction switch? –

+0

@MauricePerry je l'avais par défaut: mais il ne lisait pas certaines valeurs. Les pauses ne semblent pas non plus avoir d'impact sur mon résultat (?) – Gege

+0

Etes-vous sûr d'avoir posté le vrai code? Quand je le copie et le colle, je ne vois pas les résultats que vous dites. En particulier, ma pile ressemble à: '[, 2.0, -, *, /, ^, 3.0, /, ^, 2.0, 6.0, *, /, ^, 8.0, +, -, *, /, ^, 2.5, 3.0] ', ce qui est cohérent avec l'observation de @ MauricePerry selon laquelle il vous manque des instructions' break'. – DaveyDaveDave

Répondre

1

Copier votre code et modifier légèrement d'utiliser un Stack<String> plutôt que de mettre en œuvre vos operationNode et numberNode les classes, je trouve que les œuvres suivantes (je pense) que vous attendez:

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

C'est, je l'ai ajouté les instructions break;, dont vous n'avez apparemment pas besoin (peut-être une sorte de différence JVM?) et déplacé la boucle while en dehors du switch.

0

Vous devez envelopper switch dans while et déplacer la manipulation de double dans default bloc, .: par exemple

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

Vous devez également écrire une méthode pour vérifier double. Cela ressemblerait à ceci:

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

Désolé - je ne pense pas que ce soit correct. Cela ne traitera qu'un seul jeton par ligne. Si l'entrée est une seule ligne - "^ 2 - 3/2 6 * 8 + 2.5 3", il traitera le "^" puis s'arrêtera. – DaveyDaveDave