Java 扫描器 nextDouble 命令跳过带有 switch case 的值?

Java Scanner nextDouble command skipping values with switch case?

我正在将带有 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?

复制您的代码并稍作修改以使用 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.

您需要将 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。它看起来像这样:

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