0

我有以下代码,包括两个操作数和一个从对象转换的操作数。现在我想将它们合并到一个表达式中,以便得到最终答案。例如,该方法接收 2,3,* 并将其转换为 2*3 并返回 6。有没有一种简单的方法可以解决这个问题而无需使用大量 if 和 else if 来检查它的 +,-,*,/等等。

private long calculateExpression(Object op1, Object op2, Object op){
    long operand1 = Long.parseLong(String.valueOf(op1));
    long operand2 = Long.parseLong(String.valueOf(op2));
    Operator operator = Operator.toOperator(String.valueOf(op));

    return answer;
}
4

3 回答 3

2

如果您使用的是 jdk 6+,则可以为此使用脚本引擎,例如

private long calculateExpression(Object op1, Object op2, Object op) throws ScriptException{
    ScriptEngineManager mgr = new ScriptEngineManager();
    ScriptEngine engine = mgr.getEngineByName("JavaScript");
    String expression = "" + op1 + op + op2;
    Integer answer = (Integer) engine.eval(expression);
    return answer.longValue();
}
于 2014-04-29T13:57:36.673 回答
1

您不能将字符串直接转换为运算符。在某些时候,您将不得不添加ifelse if案例。您可以创建自己的Operator-Class 并使用它的方法来解析字符串,但这只会将ifandelse if情况转移到该类。

编辑:我必须编辑,因为我还不能发表评论......

Syam S 提供的答案似乎是有效的。但是你必须改变这条线

Integer answer = (Integer) engine.eval(expression);

Double answer = (Double) engine.eval(expression);

那么它应该可以工作。

于 2014-04-29T13:40:48.973 回答
0

来自Nashorn的示例

package sample1;

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;

public class Hello {

  public static void main(String... args) throws Throwable {
    ScriptEngineManager engineManager = 
new ScriptEngineManager();
    ScriptEngine engine = 
engineManager.getEngineByName("nashorn");
    engine.eval("function sum(a, b) { return a + b; }");
    System.out.println(engine.eval("sum(1, 2);"));
  }
}

您可以调整它以在运行时评估表达式。

于 2014-04-29T13:46:15.593 回答