java 使用JEP解析字符串計算公式 求值(附帶自定義函數編寫)

1.增加jep依賴

		<dependency>
			<groupId>org.scijava</groupId>
			<artifactId>jep</artifactId>
			<version>2.4.2</version>
		</dependency>

2.計算公式  

JEP本身支持的函數 如果沒有需要的函數  下文有自定義函數實現

計算 M12*3.14/4*pow(O5,2)*(K11+273-G11)/(G12*sqrt(3.14*M11*P11)) 的值  夠複雜吧

    public static void main(String[] args) {
        JEP jep = new JEP();
        // 添加常用函數
        jep.addStandardFunctions();
        // 添加常用常量
        jep.addStandardConstants();

        String exp = "M12*3.14/4*pow(O5,2)*(K11+273-G11)/(G12*sqrt(3.14*M11*P11))"; //給變量賦值
        jep.addVariable("M12", 1.1);
        jep.addVariable("O5", 11.28665296);
        jep.addVariable("K11", 25);
        jep.addVariable("G11", 200);
        jep.addVariable("G12", 100000);
        jep.addVariable("M11", 0.000000129);
        jep.addVariable("P11", 10);

        try { //執行
            jep.parseExpression(exp);
            double result = jep.getValue();
            System.out.println("計算結果: " + result);
        } catch (Throwable e) {
            System.out.println("An error occured: " + e.getMessage());
        }
    }

完全不是問題

3.實現自定義函數 min max

min函數 兩數取最小值

    public class Min extends PostfixMathCommand {
        public Min() {
            super();
            // 使用參數的數量
            numberOfParameters = 2;
        }

        @Override
        public void run(Stack inStack) throws ParseException {
            //檢查棧
            checkStack(inStack);
            Object param2 = inStack.pop();
            Object param1 = inStack.pop();

            if ((param1 instanceof Number) && (param2 instanceof Number)) {
                double p1 = ((Number) param2).doubleValue();
                double p2 = ((Number) param1).doubleValue();

                double result = Math.min(p1, p2);

                inStack.push(new Double(result));
            } else {
                throw new ParseException("Invalid parameter type");
            }
            return;
        }

    }

max函數 兩數取最大值

static class Max extends PostfixMathCommand {
        public Max() {
            super();
            // 使用參數的數量
            numberOfParameters = 2;
        }

        @Override
        public void run(Stack inStack) throws ParseException {
            //檢查棧
            checkStack(inStack);
            Object param2 = inStack.pop();
            Object param1 = inStack.pop();

            if ((param1 instanceof Number) && (param2 instanceof Number)) {
                double p1 = ((Number) param2).doubleValue();
                double p2 = ((Number) param1).doubleValue();

                double result = Math.max(p1, p2);

                inStack.push(new Double(result));
            } else {
                throw new ParseException("Invalid parameter type");
            }
            return;
        }

    }

驗證是否好用

    public static void main(String[] args) {
        JEP jep = new JEP();
        // 添加常用函數
        jep.addStandardFunctions();
        // 添加常用常量
        jep.addStandardConstants();
        // 添加自定義函數
        jep.addFunction("min", new Min());
        jep.addFunction("max", new Max());

        String min = "min(A1,A2)";
        String max = "max(A1,A2)";
        jep.addVariable("A1", 1.1);
        jep.addVariable("A2", 2.3);

        try { //執行
            jep.parseExpression(min);
            double minResult = jep.getValue();
            jep.parseExpression(max);
            double maxResult = jep.getValue();
            System.out.println("最小值爲: " + minResult);
            System.out.println("最大值爲: " + maxResult);
        } catch (Throwable e) {
            System.out.println("An error occured: " + e.getMessage());
        }
    }

完全沒問題

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章