用Java執行數學字符串表達式
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評估數學表達式的各種技術。