Java Scanner nextDouble命令使用switch case跳过值?

时间:2017-09-26 08:37:13

标签: java switch-statement arguments java.util.scanner next

我正在将一个带有switch case的参数文件扫描到Stack并用.nextDouble命令跳过值?

这是我的代码片段:

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 - 3 / 2 6 * 8 + 2.5 3

然而,扫描仪只收集:^ 2 - 3 / 6 * 8 + 3

所以它跳过了一对(2和2.5)中出现的第一个数字。

事情是,当我在while循环结束时添加stackScanner.next();时,它保存的唯一数字是那些值2和2.5?

2 个答案:

答案 0 :(得分:1)

复制您的代码并稍微修改以使用Stack<String>而不是实施您的operationNodenumberNode类,我发现以下内容适合(我认为)您希望:

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之外

答案 1 :(得分:0)

您需要将th { text-align: left; } 包裹到switch并将while的处理移至double块,例如:

default

您还需要编写一个方法来检查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