使用Java扫描仪和矢量类的简单计算器

时间:2012-03-10 18:42:23

标签: java java.util.scanner

我正在尝试创建一个根据优先级计算的简单计算器。该方法传递一个必须解决的字符串(表达式)。我这样做的方法是首先将字符串解析为两个向量,一个包含数字,另一个包含操作数。在我成功解析了字符串之后,我然后计算并返回答案。我从我正在使用的扫描程序类中获取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; 
}

是否有更好,更优雅的方法来解析字符串(或解决问题)?我究竟做错了什么?调试器没有提供有关错误的大量信息。

3 个答案:

答案 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是我在网上找到的一个示例实现。祝你好运!