2013-02-26 4 views
7

Допустим, у меня есть метод, который объявлен следующим образом:Включить строку в математическое выражение?

public double Calc(String expression) { 

// Code 

} 

Я хочу взять выражение типа String, как

"2 + 4 - (3 * 4)" 

Затем кормить его Calc() и она должна возвращать значение, которое он получает.

Можете ли вы проанализировать математическое выражение из строки, чтобы оно стало выражением, которое может понять Java? Потому что обычно вы могли бы просто написать

return 2 + 4 - (3 * 4); 

Но это будет работать только для этого единственного выражения.

+0

Взгляните на это: http://stackoverflow.com/questions/2605032/using-eval-in-java –

+1

Чтобы свернуть свой собственный вы обычно используете выражение дерева Http: //en.wikipedia .org/wiki/Binary_expression_tree –

+0

@beto Но кажется, что, делая это, вы открываете весь движок JS только для этого. Полагаю, хотя это дало мне подсказку. Благодаря! – OmniOwl

ответ

6

Я бы предложил использовать алгоритм двустворчатости Dijkstra.

Это должно быть довольно много, что вам нужно:

public class DijkstraTwoStack { 
    public static void main(String[] args) { 
       Scanner scanner = new Scanner(System.in); 
       String exp[] = scanner.nextLine().split(" "); 
     Stack<String> ops = new Stack<String>(); 
     Stack<Double> vals = new Stack<Double>(); 

     for(int i = 0; i < exp.length; i++) { 
         String s = exp[i]; 
      if (s.equals("(")) { 
      } 
      else if (s.equals("+") || s.equals("*")) { 
       ops.push(s); 
      } else if (s.equals(")")) { 
       getComp(ops, vals); 
      } else { 
       vals.push(Double.parseDouble(s)); 
      } 
     } 
     getComp(ops, vals); 
     System.out.println(vals.pop()); 
    } 

    private static void getComp(Stack<String> ops, Stack<Double> vals) { 
     String op = ops.pop(); 
     if (op.equals("+")) { 
      vals.push(vals.pop() + vals.pop()); 
     } else if (op.equals("*")) { 
      vals.push(vals.pop() * vals.pop()); 
     } 
    } 
} 

Не проверял, но это должно быть о праве.

+0

Не так эффективно, но можно использовать это .... 'ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName ("js"); Результат объекта = engine.eval ("3 + 4"); ' * credits: http://stackoverflow.com/a/2605051/936786 –

+0

Пожалуйста, не изменяйте код из существующих ответов.Итератор не хотел, он нарушил бы алгоритм. –

0

Позвольте мне сказать, что это процесс, который может быть принят, поскольку я думаю, что, просматривая несколько вопросов на SO, вы должны получить представление о том, как это сделать, не загружая компилятор JS.

Для начала вам нужно проанализировать свою строку с помощью функции, которая преобразует вашу математическую строку в строку infix. Затем вы в основном оцениваете это выражение как другую функцию, разбивая строку в цикле, чтобы вернуть ответ. Прекрасно подробный процесс может быть found here.

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