2017-09-26 30 views
1

私はスイッチケースを持つ引数ファイルをStackにスキャンしていますが、.nextDoubleコマンドで値をスキップしていますか? ^ 2 - 3/2 6 * 8 + 2.5 3JavaスキャナのnextDoubleコマンドは、スイッチケースで値をスキップしますか?

しかし、スキャナのみ収集します:^ 2 - 3/6 * 8 + 3

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

問題は、引数ファイルには、以下が含まれ、ここで、この最後の行、である:

は、ここに私のコードの断片です。

ここでは、ここでペアになる最初の数字(2と2.5)をスキップします。

whileループの最後にstackScanner.next();を追加すると、保存する数字は2と2.5の値だけです。

+0

あなたのケースでは休憩がなく、whileループがswitch文の中にあることに気付きましたか? –

+0

@MauricePerry私はそれをデフォルトとして持っていましたが、特定の値を読み取っていませんでした。また、ブレークは私の結果に影響していないようです(?) – Gege

+0

本当のコードを投稿してもよろしいですか?コピーして貼り付けると、あなたが見ていると言う結果が表示されません。特に、私のスタックは '' ^、2.0、 - 、*、/、^、3.0、/、^、2.0、6.0、*、/、^、8.0、+、 - 、*、/、 2.5、3.0] '@これは、あなたが' break'文を見つけていないという@MauricePerryの観察と一致しています。 – DaveyDaveDave

答えて

1

あなたのコードをコピーし、あなたのoperationNodenumberNodeクラスを実装するのではなく、Stack<String>を使用するために、わずかに修正するには、私は、次の作品は(私が思う)あなたが期待することを見つける:ある

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

、私はしましたbreak;ステートメントが追加されました.JVMの相違点のようなものは必要ありません。whileループをswitchの外に移動しました。

0

あなたは例えば、whileswitchをラップし、defaultブロックにdoubleの取り扱いを移動する必要があります。:

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

ます。またdoubleをチェックする方法を記述する必要があります。これは次のようになります:

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

申し訳ありません - これは実際には正しいとは思いません。これは、1行につき1つのトークンだけを処理します。入力が "^ 2 - 3/2 6 * 8 + 2.5 3"という単一行の場合、 "^"を処理して停止します。 – DaveyDaveDave

関連する問題