2015-03-25 3 views
0

Я хочу оценить математическое выражение sting в java. Эта строка должна содержать функции (avg, max, min, ...), применяемые к векторам или простым номерам. Я уже использую ScriptEngineManager с движком javasript, но он просто использует числа. Я также вижу symja lib, но он выглядит слишком сложным и не документирован. Как сделать? СпасибоКак оценить выражение строки строки в java

+1

вы можете дать пример строки, которую вы используете? – drgPP

+0

Решение ScriptEngine, которое вы уже используете, представляет собой полный интерпретатор JavaScript, поэтому он уже поддерживает функции. – Boann

ответ

0

Посмотрите на классы математики и струны javadoc. Если вы знаете формат строки, вы можете найти ее, чтобы найти конкретные номера и функции, которые вы используете. Если вы используете только один из avg/max/min на каждый вход, это должно быть довольно легко.

Вот пример, предположим, что вы хотите его отформатирован как так (это легко, если Theres запятую после каждого значения):

"FUNCTION (а, б, в,)" -> «MIN (3, 6,8,) «

Первое, что вы хотите сделать, это выяснить, какую функцию вы выполняете. Используя метод indexOf, мы можем выяснить, содержит ли он MIN или MAX или что-то еще.

if(expression.indexOf("MIN" != -1){ 
     //calculate min value 
} 

Вам также понадобится создать список всех номеров, которые вы используете.

int lastIndex = exression.indexOf("("); 
while(lastIndex < expression.lastIndexOf(","){ 
     listOfNums.add(Integer.parseInt(expression.subString(lastIndex + 1, expression.indexOf(",", lastIndex + 1))); 
     lastIndex = expression.indexOf(",", lastIndex + 1); 
    } 
0

Есть два очень хорошее выражение парсеры, JEP (оплачивается в настоящее время, к сожалению, - http://www.singularsys.com/jep/) и Jexl (гораздо больше, чем просто выражение парсер - http://commons.apache.org/proper/commons-jexl/).

Я предпочитаю Jexl, так вот пример:

JexlEngine jexl = new JexlEngine(); 
// The expression to evaluate 
Expression e = jexl.createExpression("((a || b) || !c) && !(d && e)"); 

// Populate the context 
JexlContext context = new MapContext(); 
context.set("a", true); 
context.set("b", true); 
context.set("c", true); 
context.set("d", true); 
context.set("e", true); 

// Work it out 
Object result = e.evaluate(context); 

Другие примеры - http://commons.apache.org/proper/commons-jexl/reference/examples.html

Приветствия ...

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