我在java工作,我必须评估以String形式给出的数学表达式。例如:
"5*8-9/7+5-8"
将导致
35.71.
我试过“java eval库”,但没有找到帮助。请告诉我如何解决这类问题。 我可以使用数据结构堆栈或队列来评估这些表达式,但我必须考虑运算符优先级,因为乘法是在减法,加法之前完成的。 适合这种情况的数据结构最好记住时间复杂性。
答案 0 :(得分:6)
从Java 6开始,您可以使用内置Javascript引擎。
ScriptEngineManager sem = new ScriptEngineManager();
ScriptEngine eng = sem.getEngineByName("JavaScript");
String str = "5*8-9/7+5-8";
System.out.println(eng.eval(str));
注意:eval()
方法会抛出ScriptException
,您还需要以下导入。
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
答案 1 :(得分:2)
最简单的方法是使用Java Script Engine。更具体地说,Ecma脚本(也称为Javascript)支持,内置并且其语法与Java非常相似。
您需要做的是使用您想要的任何方法检索字符串,并要求脚本引擎评估此字符串。
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
public class X {
public static void main(String[] args) throws ScriptException {
String calculation = "8 * 10 + 3";
ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript");
Object result = engine.eval(calculation);
System.out.println(result);
}
}
另一个选择是构建自己的DSL。我会推荐Antlr。这是更难,但会解决你的问题。
答案 2 :(得分:1)
如果您不想为了评估字符串数学表达式而单独运行javascript引擎,那么似乎有其他人遇到了同样的问题。也许这是另一种选择:
http://jeval.sourceforge.net/docs/api/net/sourceforge/jeval/Evaluator.html