我必须创建一个程序来模拟计算器。我们必须在 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/