Рубрики
Без рубрики

Оценка математического выражения в Java

Автор оригинала: baeldung.

1. Обзор

В этом уроке мы обсудим различные подходы к оценке математического выражения с использованием Java. Эта функция может пригодиться в проектах, где мы хотим оценивать математические выражения, представленные в строковом формате.

Для начала мы обсудим несколько сторонних библиотек и их использование. Далее мы посмотрим, как мы можем использовать встроенный API сценариев Java для решения этой задачи.

2. exp4j

exp4j -это библиотека с открытым исходным кодом, которую можно использовать для оценки математических выражений и функций. Библиотека реализует Алгоритм маневрового двора Дейкстры, метод анализа математических выражений, указанных в инфиксной нотации .

В дополнение к использованию стандартных операторов и функций, expo позволяет нам создавать пользовательские операторы и функции.

2.1. Добавление зависимости Maven

Чтобы использовать exp4j, нам нужно будет добавить зависимость Maven в наш проект:


    net.objecthunter
    exp4j
    0.4.8

2.2. Оценка Простых Выражений

Мы можем оценить простое математическое выражение, представленное в формате Строка :

@Test
public void givenSimpleExpression_whenCallEvaluateMethod_thenSuccess() {
    Expression expression = new ExpressionBuilder("3+2").build();
    double result = expression.evaluate();
    Assertions.assertEquals(5, result);
}

В приведенном выше фрагменте кода мы сначала создаем экземпляр Expression Builder . Затем мы присваиваем его ссылке Выражение , которую мы используем для оценки нашего выражения.

2.3. Использование переменных в выражениях

Теперь, когда мы знаем, как оценивать простые выражения, давайте добавим некоторые переменные в наше выражение:

@Test
public void givenTwoVariables_whenCallEvaluateMethod_thenSuccess() {
    Expression expression = new ExpressionBuilder("3x+2y")
      .variables("x", "y")
      .build()
      .setVariable("x", 2)
      .setVariable("y", 3);
 
    double result = expression.evaluate();
 
    Assertions.assertEquals(12, result);
}

В приведенном выше примере мы вводим две переменные x, и y, , используя метод переменные . Мы можем добавить столько переменных, сколько нам нужно в выражение, используя этот метод. Как только мы объявим переменные, мы сможем присвоить им значения с помощью метода setVariable .

2.4. Вычисление Выражений, Содержащих Математические Функции

Давайте теперь рассмотрим краткий пример того, как мы можем оценить некоторые стандартные математические функции:

@Test
public void givenMathFunctions_whenCallEvaluateMethod_thenSuccess() {
    Expression expression = new ExpressionBuilder("sin(x)*sin(x)+cos(x)*cos(x)")
      .variables("x")
      .build()
      .setVariable("x", 0.5);
 
    double result = expression.evaluate();
 
    Assertions.assertEquals(1, result);
}

3. Явалуатор

Оценщик – это еще одна независимая и легкая библиотека, доступная бесплатно. Как и exp4j, Javaluator также используется для оценки выражений с инфиксом .

3.1. Добавление зависимости Maven

Мы можем использовать следующую зависимость Maven для использования оценщика в нашем проекте:


    com.fathzer
    javaluator
    3.0.3

3.2. Оценка Простых Выражений

Чтобы оценить выражения с помощью Javaluator, нам сначала нужно создать экземпляр DoubleEvaluator :

@Test
public void givenExpression_whenCallEvaluateMethod_thenSuccess() {
    String expression = "3+2";
    DoubleEvaluator eval = new DoubleEvaluator();
 
    Double result = eval.evaluate(expression);
 
    Assertions.assertEquals(5, result);
}

3.3. Оценка Выражений, Содержащих Переменные

Для оценки выражений, содержащих переменные, мы используем Набор статических переменных :

@Test
public void givenVariables_whenCallEvaluateMethod_thenSuccess() {
    String expression = "3*x+2*y";
    DoubleEvaluator eval = new DoubleEvaluator();
    StaticVariableSet variables = new StaticVariableSet();
    variables.set("x", 2.0);
    variables.set("y", 3.0);
 
    Double result = eval.evaluate(expression, variables);
 
    Assertions.assertEquals(12, result);
}

Затем мы используем метод Набор статических переменных#set для присвоения значений переменным.

3.4. Вычисление Выражений, Содержащих Математические Функции

Мы также можем решать выражения, содержащие математические функции, с помощью библиотеки оценщиков:

@Test
public void givenMathFunction_whenCallEvaluateMethod_thenSuccess() {
    String expression = "sin(x)*sin(x)+cos(x)*cos(x)";
    DoubleEvaluator eval = new DoubleEvaluator();
    StaticVariableSet variables = new StaticVariableSet();
    variables.set("x", 0.5);
 
    Double result = eval.evaluate(expression, variables);
 
    Assertions.assertEquals(1, result);
}

4. API сценариев Java

Теперь, когда мы обсудили сторонние библиотеки, давайте обсудим, как мы можем достичь этого с помощью встроенного API. Java уже поставляется с небольшим, но мощным скриптовым API. Все классы и интерфейсы этого API находятся в пакете javax.script .

Он содержит ScriptEngineManager и Движок сценариев интерфейсы, которые позволяют нам оценивать JavaScript. До Java 8 Java поставлялась с движком Rhino . Однако, начиная с Java 8, Java поставляется с более новым и мощным движком Nashorn .

4.1. Получение экземпляра ScriptEngine

Чтобы создать Движок сценариев , нам сначала нужно создать экземпляр ScriptEngineManager . Как только у нас будет экземпляр, нам нужно вызвать ScriptEngineManager#getEngineByName метод, чтобы получить Механизм сценариев :

ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
ScriptEngine scriptEngine = scriptEngineManager.getEngineByName("JavaScript");

Обратите внимание, что Нашорн это движок JavaScript по умолчанию, который поставляется в комплекте с JDK.

4.2. Оценка Простых Выражений

Теперь мы можем использовать приведенный выше экземпляр script Engine для вызова метода Script Engine#eval :

String expression = "3+2";
Integer result = (Integer) scriptEngine.eval(expression);
Assertions.assertEquals(5, result);

4.3. Оценка Выражений, Содержащих Переменные

Чтобы оценить выражения, содержащие переменные, нам необходимо объявить и инициализировать переменные:

String expression = "x=2; y=3; 3*x+2*y;";
Double result = (Double) scriptEngine.eval(expression);
Assertions.assertEquals(12, result);

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

Примечание – JavaScript не имеет прямых методов для выполнения математических операций и требует доступа к Математика объект. Таким образом, мы не можем решать математические выражения с помощью API сценариев Java.

5. Заключение

В этой статье мы рассмотрели различные методы оценки математических выражений с использованием Java.

Как всегда, полный код для этого примера доступен на GitHub .