Java - 如何使用hashmap映射简单的数学运算符

时间:2015-02-07 04:02:30

标签: java hashmap

我必须创建一个程序来模拟计算器。我们必须在Operator类中使用hashmap,但我不知道如何解决这个问题。 我理解的基本逻辑是。我们发送程序一个简单的表达式,如1 + 2-3 * 4/5。然后程序将其分成两个堆栈。一个有操作符,一个有操作数。在划分字符时,我们必须检查操作符的哈希映射,然后将其推送到堆栈,这就是我被困住的地方。如何/在何处放置/使用hashmap?我的代码如下:

import java.util.*;

public class Evaluator {

    private Stack<Operand> opdStack;
    private Stack<Operator> oprStack;

    public Evaluator() {
        opdStack = new Stack<Operand>();
        oprStack = new Stack<Operator>();
    } // end constructor

    public int eval(String expr) {
        String tok;
        expr = expr + "!";

        String delimiters = "+-*/#! ";
        StringTokenizer st = new StringTokenizer(expr, delimiters, true);

        while (st.hasMoreTokens()) {
            tok = st.nextToken();
            if(!tok.equals(" ")) {
                if(Operand.check(tok)){
                    opdStack.push(new Operand(tok));
                }
                else{
                    if (!Operator.check(tok)) {
                        System.out.println("*****invalid token******\n");
                        System.exit(1);
                    } // end if
                } // end else
            } // end if
        } // end while
        return 0;
    } // end eval
} // end Evaluator

abstract class Operator {

    static HashMap operators = new HashMap();

    public abstract int priority();

    static boolean check(String tok) {
        boolean result = false;
        operators.put("#", new PoundOperator());
        operators.put("!", new ExclamationOperator());
        operators.put("+", new AdditionOperator());
        operators.put("-", new SubtractionOperator());
        operators.put("*", new MultiplicationOperator());
        operators.put("/", new DivisionOperator());

        if (operators.containsKey(tok)) {
            result = true;
        }
        return result;
    } // end check

    public abstract Operand execute(Operand opd1, Operand opd2);

} // end Operator

非常感谢任何帮助/澄清。 谢谢。

1 个答案:

答案 0 :(得分:1)

有几件事......

1)HashMap类是通用的,可以使用类型参数使其更容易使用:HashMap<String, Operator>

2)每次调用Operator方法时,都会在哈希映射中添加check s的新实例。这些实例只是覆盖旧实例,但这不是您想要的行为。哈希映射的初始化(所有operators.put语句)应该在static initializer中进行。这样,它只发生一次。

3)您需要从哈希地图中检索您的真正长评论(&#34;我在这里检查......&#34;)的位置Operator。怎么会发生这种情况?好吧,operators地图只是包私有,所以你可能只是直接使用Operator.operators.get,但我想这不是意图。我相信你想在Operator类中使用一个单独的静态getter方法,例如:

abstract class Operator {
    ...
    static Operator get(String token) {
        return operators.get(token);
    }
    ...
}

有了这个,你应该能够通过像Operator这样的电话将oprStack.push(Operator.get(tok));推到你的筹码上。