簡體   English   中英

如何通過while循環一次處理輸入一個數字

[英]How to process input one number at a time through a while loop

我的主要方法要求用戶輸入一個表達式,輸入類似於“5 4 +”或“6 4 + 8 /”,操作數和運算符用空格分隔。 我有一種方法可以處理這個輸入並給出它等於的答案。 它遍歷通過 while 循環輸入的所有數字,該循環結束一次scnr.hasNext() == true ,或者當 errorMessage 不是 null 時。 目前, scnr.hasNext()比預期更快地變為假,導致循環只讀取第一個數字,然后結束。 它變得錯誤,因為我嘗試將scnr.nextInt()存儲到變量中。 我需要它只取第一個數字,並留下 rest,我認為這將使scnr.hasNext()保持真實。 這是我的整個方法

public static Number evaluateExpression(String expr) {
        int var = 0;
        String input = "";

        String tooFewOperands = "Too few operands";
        String unKnownOperator = "Unknown operator:";
        String tooManyOperands = "Too many operands.";

        Stack<Integer> stack = new Stack<>();
        String errMsg = null;

        Scanner scnr = new Scanner(expr);

        while (scnr.hasNext() && errMsg == null) {
            if (scnr.hasNextInt()) {
                var = scnr.nextInt();                           //Problematic line
                System.out.println("Operand read: " + var);
                stack.push(var);
            } else {
                input = scnr.next();
                if (checkValidOperator(input) == input.toCharArray()[0]) {
                    System.out.println("Operator read: " + input);
//                    stack.push(var);
                    if (stack.size() >= 2) {
                        execute(stack, input.toCharArray()[0]);
                    } else {
                        errMsg = tooFewOperands;
                    }
                } else {
                    errMsg = unKnownOperator + " " + input + " ";
                }
            }
            System.out.println("------ Stack state -----");
            System.out.println(stack.toString());
            System.out.println(scnr.hasNext());
        }
        if (errMsg != null) {
            System.out.println("Failed evaluation of |" + expr + "|\n" + errMsg);
            return null;
        }
        if (stack.size() > 1) {
            System.out.println("Failed evaluation of |" + expr + "|\n" + tooManyOperands + stack.toString());
            return null;
        } else {
            return stack.peek();
        }
    }

請注意, Scanner scnr是用String expr初始化的,我認為我的老師暗示允許我從scnr讀取單個標記。 她說“使用 expr 作為其構造函數的參數來初始化掃描儀,這將允許您從表達式中讀取標記。” 我從來沒有用System.in以外的東西初始化過 Scanner 。 她還指定要使用此方法,我應該“編寫一個循環,只要掃描儀有輸入 (hasNext) 並且錯誤消息為 null 就會運行。” 所以這就是while條件必須是什么。

一般來說,當您為字符串類型和數字類型制作掃描儀 object 時,它會發生(或者至少它發生在我身上)。

我所做的是使用var = Integer.parseInt(scnr.nextLine()); 反而。

希望對您有所幫助。

我認為您的Scanner代碼的結構沒有任何問題。

唯一的觀察是這條線看起來很奇怪:

if (checkValidOperator(input) == input.toCharArray()[0])

checkValidOperator的實現是什么?

這個簡單的版本似乎沒有任何問題。 將此與您的版本進行比較,看看您是否可以確定哪些元素可能導致問題。

public static void main(String[] args)
{
    String expr = "6 4 + 8 /";

    Scanner scnr = new Scanner(expr);

    String errorMsg = null;

    while (scnr.hasNext() && errorMsg == null)
    {
        if (scnr.hasNextInt())
        {
            int var = scnr.nextInt();
            System.out.println("Operand: " + var);
        } 
        else
        {
            String operator = scnr.next();
            if (isOperator(operator))
            {
                System.out.println("Operator: " + operator);
            } 
            else
            {
                errorMsg = "Unknown Operator: " + operator;
            }
        }
    }
}

static boolean isOperator(String op)
{
    return op.length() == 1 && "+-*/".indexOf(op) >= 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM