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

标签 java hashmap

我必须创建一个程序来模拟计算器。我们必须在 Operator 类中使用 HashMap ,但我不知道如何去做。 我理解的基本逻辑是。我们向程序发送一个简单的表达式,例如 1+2-3*4/5 。然后程序会将其分为两个堆栈。一种带有运算符,一种带有操作数。当划分字符时,我们必须检查运算符的 HashMap ,然后将其插入堆栈,这就是我陷入困境的地方。如何/在哪里放置/使用 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) HashMap类是通用的,可以采用类型参数以使其更易于使用:HashMap<String, Operator> .

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

3) 您需要检索 Operator从 HashMap 中您当前非常长的评论(“我在这里检查...”)所在的位置。怎么会这样呢?嗯,operators map 只是包私有(private)的,因此您可能只使用 Operator.operators.get直接,但我想这不是意图。我相信你想要一个单独的静态 getter 方法 Operator类,类似:

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

有了这个,您应该能够按下 Operator通过像 oprStack.push(Operator.get(tok)); 这样的调用进入你的堆栈.

关于Java - 如何使用 HashMap 来映射简单的数学运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28378402/

相关文章:

java - 如果放入 hashmap 超过容量会怎样

java - 从 HashMap<String, HashSet<Integer>> 获取随机值

java - 抽象类数组和 oop 设计 - Java

java - 我有两个非常相似的 C 函数被 python 和 Java 调用。如何将 2 个库合并为 1 个可以从两种语言调用的库?

java - 当我在 fragment 中后按时按钮不可见

java - 当我第一次按下将我连接到 SQL Server 2012 数据库并执行特定查询的 JFXButton 时,为什么会出现延迟?

java - 使用 .clone() 复制属性

java - 如何使用 f :ajax? 使 jsf 更改按下按钮后呈现的内容

java - 使用大小为 30K 的数组进行测试时,使用 HashMap 实现的代码失败

java - 确定 Java HashMap 中最低可用键的最快方法?