用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方法引入了兩個變量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評估數學表達式的各種技術。