Der*_*rek 5 java string methods map
我正在用Java编写表达式求值程序.我希望能够添加更多运算符(我目前只有(,),+, - ,*,/和^).目前,我的代码如下所示:
case '+':
return a+b;
case '-':
return a-b;
case '*':
return a*b;
...
Run Code Online (Sandbox Code Playgroud)
这适用于我的代码,因为我只有几个运算符.但是,如果我要添加更多运算符,代码就会变得混乱.我正在寻找一种方法将运算符(由String表示)映射到方法.例如,"ln"将映射到Math.log(),"^"将映射到Math.pow()等.
我该怎么做呢?如果不可行,有哪些替代方案?
除非你想使用反射,否则不可能.没有反射的解决方案可能如下所示:
public interface Operation {
int apply(int... operands);
}
public abstract class BinaryOperation implements Operation {
@Override
public int apply(int... operands) {
return apply(operands[0], operands[1]);
}
abstract int apply(int a, int b);
}
Map<String, Operation> operations = new HashMap<String, Operation>() {{
put("+", new Operation() {
@Override
public int apply(int... operands) {
return operands[0] + operands[1];
}
});
put("-", new BinaryOperation() {
@Override
public int apply(int a, int b) {
return a - b;
}
});
}};
Run Code Online (Sandbox Code Playgroud)
您可以使用模板方法。
public enum Functions {
ADD() {
@Override public int execute(int a, int b) {
return a+b;
}
},
SUB() {
@Override public int execute(int a, int b) {
return a-b;
}
};
//Template method
public abstract int execute(int a, int b);
}
Run Code Online (Sandbox Code Playgroud)
然后在字符串和枚举之间映射Map<String, Functions> functionMap
所以如果你想添加你可以做functionMap.put("+", Functions.ADD);
然后调用functionMap.get("+").execute(a,b);
我想如果不同的函数采用不同数量的参数,您也可以使用可变参数。
public abstract int execute (Integer... inputs);
这个例子是根据Making Most of Java 5.0: Enum Tricks和 @duffymo 所说的修改的。
我认为你的设置是最佳设置,因为我想不出一种方法可以在 java 中轻松做到这一点,尽管在像 c/c++ 这样的语言中,你可以轻松地将字符串映射到函数指针,但我不认为在Java 据我所知。switch 语句的优点在于它们实际上避免了混乱,因为从视觉上你可以很容易地看到 switch 语句的情况是什么,并且只需查找你想要的适当的情况(尽管对于你创建的字符串需要一个巨大的 if 级联,因为 = = 运算符在 java 中没有重载用于字符串比较)。
编辑:请参阅 Ryan Stewarts 评论,他们使用 OOP 方法完全按照您的要求进行操作。尽管在某些情况下这看起来比 switch 语句更混乱。
| 归档时间: |
|
| 查看次数: |
2889 次 |
| 最近记录: |