拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 用Java执行数学字符串表达式

用Java执行数学字符串表达式

白鹭 - 2021-11-24 522 0 0

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方法引入了两个变量xy, 。使用此方法,我们可以在表达式中添加所需数量的变量。声明变量后,可以使用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包中。

它包含ScriptEngineManagerScriptEngine接口,使我们可以评估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 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *