我正在将一个带有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?
答案 0 :(得分:1)
复制您的代码并稍微修改以使用Stack<String>
而不是实施您的operationNode
和numberNode
类,我发现以下内容适合(我认为)您希望:
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