1.概述
在本教程中,我们将讨论使用Java执行数学字符串表达式的各种方法。在我们要执行以字符串格式提供的数学表达式的项目中,此功能可能会派上用场。
首先,我们将讨论一些第三方库及其用法。接下来,我们将看到如何使用内置的Java Scripting API来完成此任务。
2. exp4j
exp4j是一个开源库,可用于评估数学表达式和函数。该库实现了Dijkstra的Shunting Yard算法,这是一种解析以中缀符号指定的数学表达式的方法。
除了使用标准运算符和函数之外,exp4j还允许我们创建自定义运算符和函数。
2.1。添加Maven依赖
要使用exp4j,我们需要在项目中添加Maven依赖项:
<dependency>
<groupId>net.objecthunter</groupId>
<artifactId>exp4j</artifactId>
<version>0.4.8</version>
</dependency>
2.2。评估简单表达式
我们可以评估以String
格式提供的简单数学表达式:
@Test
public void givenSimpleExpression_whenCallEvaluateMethod_thenSuccess() {
Expression expression = new ExpressionBuilder("3+2").build();
double result = expression.evaluate();
Assertions.assertEquals(5, result);
}
在上面的代码片段中,我们首先创建一个ExpressionBuilder
实例。然后,将其分配给一个Expression
引用,该表达式用于评估表达式。
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);
}
在上面的示例中,我们使用variables
方法引入了两个变量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. Javaluator
Javaluator是另一个免费的轻量级独立库。像exp4j一样,Javaluator也用于评估中缀表达式。
3.1。添加Maven依赖
我们可以使用以下Maven依赖项在项目中使用Javaluator:
<dependency>
<groupId>com.fathzer</groupId>
<artifactId>javaluator</artifactId>
<version>3.0.3</version>
</dependency>
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。评估包含变量的表达式
要评估包含变量的表达式,我们使用StaticVariableSet
:
@Test
public void givenVariables_whenCallEvaluateMethod_thenSuccess() {
String expression = "3*x+2*y";
DoubleEvaluator eval = new DoubleEvaluator();
StaticVariableSet<Double> variables = new StaticVariableSet<Double>();
variables.set("x", 2.0);
variables.set("y", 3.0);
Double result = eval.evaluate(expression, variables);
Assertions.assertEquals(12, result);
}
然后,我们使用StaticVariableSet#set
方法将值分配给变量。
3.4。评估包含数学函数的表达式
我们还可以使用Javaluator库求解包含数学函数的表达式:
@Test
public void givenMathFunction_whenCallEvaluateMethod_thenSuccess() {
String expression = "sin(x)*sin(x)+cos(x)*cos(x)";
DoubleEvaluator eval = new DoubleEvaluator();
StaticVariableSet<Double> variables = new StaticVariableSet<Double>();
variables.set("x", 0.5);
Double result = eval.evaluate(expression, variables);
Assertions.assertEquals(1, result);
}
4. Java脚本API
现在,我们已经讨论了第三方库,现在我们来讨论如何使用内置API实现此目的。 Java已经带有一个小型但功能强大的脚本API。该API的所有类和接口都在javax.script
包中。
它包含ScriptEngineManager
和ScriptEngine
接口,使我们可以评估JavaScript。在Java 8之前, Rhino
引擎附带Java。但是,从Java 8开始,Java附带了更新和更强大的Nashorn引擎。
4.1。获取ScriptEngine
实例
要创建ScriptEngine
,我们首先必须创建ScriptEngineManager
的实例。有了实例后,我们需要调用ScriptEngineManager#getEngineByName
方法来获取ScriptEngine
:
ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
ScriptEngine scriptEngine = scriptEngineManager.getEngineByName("JavaScript");
请注意, Nashorn
是JDK附带的默认JavaScript引擎。
4.2。评估简单表达式
现在,我们可以使用上述scriptEngine
实例来调用ScriptEngine#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没有直接的方法来执行数学运算,并且需要访问Math
对象。因此,我们无法使用Java Scripting API求解数学表达式。
**
5.结论
在本文中,我们已经看到了使用Java评估数学表达式的各种技术。
0 评论