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>
而不是实现您的 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
.
您需要将 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;
}
}
我正在将带有 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>
而不是实现您的 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
.
您需要将 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;
}
}