我正在尝试创建一个根据优先级计算的简单计算器。该方法传递一个必须解决的字符串(表达式)。我这样做的方法是首先将字符串解析为两个向量,一个包含数字,另一个包含操作数。在我成功解析了字符串之后,我然后计算并返回答案。我从我正在使用的扫描程序类中获取java.util.InputMismatchException。这是我的代码:
public static int performCalc(String problem)
{
// 3 * 2 + 4 / 1 + 2 + 4
Pattern op = Pattern.compile("[*/+-]");
String prob;
Vector<Integer> nums = new Vector();
Vector<String> operands = new Vector();
int answer = 0, index = 0, numOne, numTwo;
Scanner scNums = new Scanner(problem);
Scanner scOperands = new Scanner(problem);
while(scNums.hasNext())
{
nums.add(scNums.nextInt());
}
while(scNums.hasNext())
{
operands.add(scNums.next(op));
}
for(int i = 0; i<operands.size(); i++)
{
if(operands.get(i) == "*" || operands.get(i) == "/")
{
nums.set(i, calc(nums.get(i), operands.get(i), nums.get(i+1)));
nums.remove(i+1);
}
}
for(int i = 0; i<operands.size(); i++)
{
if(operands.get(i) == "+" || operands.get(i) == "-")
{
nums.set(i, calc(nums.get(i), operands.get(i), nums.get(i+1)));
nums.remove(i+1);
}
}
return nums.firstElement();
}
public static int calc(int numOne, String operand, int numTwo)
{
if(operand == "*")
return numOne*numTwo;
if(operand == "/")
return numOne/numTwo;
if(operand == "+")
return numOne+numTwo;
if(operand == "-")
return numOne-numTwo;
return 0;
}
是否有更好,更优雅的方法来解析字符串(或解决问题)?我究竟做错了什么?调试器没有提供有关错误的大量信息。
答案 0 :(得分:0)
我不确定这是否是问题,但不应该是第二个while循环的代码
while(scOperands.hasNext())
答案 1 :(得分:0)
在第一个循环中
while(scNums.hasNext())
你正在从输入参数(问题)中读取数据,我想你传递了带有整数和操作数的字符串(比如“3 * 2 +”)。所以当你在符号“*”上调用nextInt时,你得到了InputMismatchException。
可能你想写这样的东西(小心 - 如果输入参数中有奇数个符号会发生什么):
Scanner scanner = new Scanner(problem);
while(scanner.hasNext())
{
nums.add(scanner.nextInt());
operands.add(scanner.next(op));
}
答案 2 :(得分:0)
我个人会使用Reverse Polish Notation(RPN)。一开始可能会让人感到困惑,但是一旦理解了语法,就可以很容易地实现堆栈。您的输入可以像分隔字符串一样简单,而不是处理扫描程序。 Here是我在网上找到的一个示例实现。祝你好运!