2013-11-12 8 views
1

Я работаю в java, и мне нужно оценить математические выражения, заданные как String. Например:Оценка выражения в java

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

приведет

35.71.

Я попробовал для "Java Eval библиотеки", но не нашли никакой помощи. Скажите, пожалуйста, как решить эту проблему. Я могу оценить выражение, подобное этим, используя стек структуры данных или очередь, но я должен рассмотреть приоритет оператора, поскольку умножение выполняется до вычитания, добавления. Какая структура данных удовлетворяет этой ситуации, лучше всего учитывая сложность времени.

+0

Вы должны использовать некоторые формы сценариев. Вы можете вызывать языки сценариев (например, javascript) в java –

ответ

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; 
2

Самый простой способ - использовать Java Script Engine. Более конкретно, поддержка скрипта Ecma (aka 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 для этого. Это waaay сложнее, но решит вашу проблему.

Смежные вопросы