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 .