1

我在java中工作,我必须评估作为字符串给出的数学表达式。例如:

"5*8-9/7+5-8"

将导致

35.71.

我尝试了“java eval library”,但没有找到任何帮助。请告诉我如何解决此类问题。我可以使用数据结构堆栈或队列来评估这样的表达式,但我必须考虑运算符的优先级,因为乘法是在减法、加法之前完成的。牢记时间复杂度,哪种数据结构最适合这种情况。

4

3 回答 3

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()方法会抛出 aScriptException并且您还需要以下导入。

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
于 2013-11-12T10:37:00.783 回答
2

最简单的方法是使用 Java 脚本引擎。更具体地说,支持 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。这更难,但会解决你的问题。

于 2013-11-12T10:42:15.163 回答
1

如果您不想仅出于评估字符串数学表达式的目的而运行 javascript 引擎,那么似乎还有其他人遇到了同样的问题。也许这是另一种选择:

http://jeval.sourceforge.net/docs/api/net/sourceforge/jeval/Evaluator.html

于 2013-11-12T10:56:43.493 回答