[英]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.