首页 > 其他分享 >对字符串形式的公式进行数学计算处理方法

对字符串形式的公式进行数学计算处理方法

时间:2024-07-31 17:21:28浏览次数:8  
标签:jep String 公式 字符串 import 数学计算 表达式

一、通过JavaScript引擎(Nashorn)进行处理,较新jdk版本不支持

在JavaFX中,将字符串表示的公式转化为实际可计算的公式是一个涉及到解析和评估字符串表达式的过程。你可以使用Java的内置库javax.script来实现这个功能。javax.script允许你执行JavaScript代码,包括数学表达式,并且它提供了强大的脚本引擎,如JavaScript引擎(Nashorn)。

以下是一个简单的例子,演示了如何使用javax.script来评估一个字符串形式的数学表达式:

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

public class EvaluateExpression {

public static void main(String[] args) {
// 创建一个JavaScript引擎
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("JavaScript");

// 定义一个数学表达式字符串
String expression = "x + y - z";

// 为表达式中的变量赋值
engine.put("x", 5);
engine.put("y", 10);
engine.put("z", 3);

try {
// 评估表达式并获取结果
Object result = engine.eval(expression);

// 输出结果
System.out.println("Result: " + result);

} catch (ScriptException e) {
e.printStackTrace();
}
}
}
在这个例子中,我们首先创建了一个ScriptEngineManager实例,然后获取了JavaScript引擎。我们定义了一个表达式字符串,并在引擎中设置了变量x,y,z的值。最后,我们使用engine.eval方法来评估表达式并打印结果。

如果你正在开发JavaFX应用程序,并且想要在界面上接受用户输入的公式,并对其进行计算,你可以使用类似的方法。用户输入的公式可以作为字符串传递给ScriptEngine.eval方法,然后你可以处理结果并将计算结果显示给用户。

请注意,在实际应用中,你需要对用户输入的公式进行适当的验证和异常处理,以确保安全性和健壮性。此外,这个例子使用的是JavaScript引擎,它支持ECMAScript 5.1规范,所以你可以使用各种JavaScript特性,包括数学运算符。如果你需要支持更复杂的数学表达式或函数,你可能需要使用专门的数学库,如Apache Commons Math库。

二、使用Apache Commons Math是一个开源库处理,较简单的计算

Apache Commons Math是一个开源库,它提供了大量的数学算法和数学数据类,可以帮助你在Java中进行数学计算。在Commons Math库中,有一个名为org.apache.commons.math3.analysis.expression.ExpressionParser的类,它可以用来解析和评估字符串表达式。

以下是如何使用ExpressionParser类来计算一个字符串公式的示例:

首先,确保你已经添加了Apache Commons Math库到你的项目中。如果你使用Maven,可以在pom.xml文件中添加以下依赖:

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-math3</artifactId>
    <version>3.6.1</version>
</dependency>

然后,你可以使用以下Java代码来计算一个字符串公式:

import org.apache.commons.math3.analysis.ExpressionEvaluator;
import org.apache.commons.math3.analysis.expression.Expression;
import org.apache.commons.math3.analysis.expression.ExpressionParser;
import org.apache.commons.math3.exception.ParseException;

public class MathExpressionEvaluator {

    public static void main(String[] args) {
        // 定义一个字符串公式
        String formula = "2 * (3 + 4)";

        // 创建一个ExpressionParser实例
        ExpressionParser parser = new ExpressionParser();

        try {
            // 解析字符串公式
            Expression expression = parser.parse(formula);

            // 创建一个ExpressionEvaluator实例
            ExpressionEvaluator evaluator = expression.getEvaluator();

            // 计算并获取结果
            double result = evaluator.evaluate();

            // 输出结果
            System.out.println("Result: " + result);

        } catch (ParseException e) {
            e.printStackTrace();
        }
    }
}

在这个例子中,我们首先定义了一个字符串公式"2 * (3 + 4)"。然后创建了一个ExpressionParser实例来解析这个公式。解析成功后,我们使用getEvaluator()方法获取一个ExpressionEvaluator实例,并调用evaluate()方法来计算并获取公式的结果。

请注意,Apache Commons Math的ExpressionParser支持的是一个非常基础的表达式语言,它可以处理基本的数学运算,包括加、减、乘、除以及括号。对于更复杂的表达式或函数,你可能需要使用其他库或框架,如JEP(Java表达式解析器),它是Java的一款强大的数学表达式解析和计算库,支持自定义函数和运算符。

三、使用第三方类库,需要手动下载jar文件加入项目中

如果你想使用JEP,你可以在Maven中添加以下依赖:

<!-- jep-java-4.0-trial.jar文件maven仓库官网不存在需要手动下载再加入pom.xml及项目中,
官网地址:https://www.singularsys.com/jep/download-trial.php
-->

<dependency>
<groupId>com.singularsys</groupId>
<artifactId>jep</artifactId>
<version>4.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/src/main/resources/lib/jep-java-4.0-trial.jar</systemPath>
</dependency>

然后使用JEP来计算表达式:

import com.singularsys.jep.Jep;
import com.singularsys.jep.ParseException;

public class JepExpressionEvaluator {

    public static void main(String[] args) {
        // 创建一个Jep实例
        Jep jep = new Jep();

        // 定义一个字符串公式
        String formula = "2 * (3 + 4)";

        try {
            // 解析并计算字符串公式
            jep.parse(formula);
            Object result = jep.evaluate();

            // 输出结果
            System.out.println("Result: " + result);

        } catch (ParseException e) {
            e.printStackTrace();
        }
    }
}

JEP也提供了丰富的功能,如自定义函数、运算符重载等,可以根据你的需要进行扩展。

/////////////////////////////////////////////////////////////参照///////////////////////////////////////////////////////////////////

Java第三方库——Jep数学公式计算
官网简介:JEP JAVA仅用几行代码解析和计算数学表达式。这个包允许用户以字符串的形式输入公式,并立即对其求值。JEP支持用户定义的变量、常量和函数。包括一些常用的数学函数和常量。

1.下载3.x版本依赖并引入
官方网站:http://www.singularsys.com/jep/download-trial.php

由于Maven仓库中目前没有3.x版本的jep,需要手动下载引入到项目中 

 

下载的压缩包中包含jar包,放入项目目录下并在pom.xml中引入,这里我是放到了resources/lib下

 

 

<dependency>
<groupId>com.singularsys</groupId>
<artifactId>jep</artifactId>
<version>3.5</version>
<scope>system</scope>
<systemPath>${project.basedir}/src/main/resources/lib/jep-java-3.5-trial.jar</systemPath>
</dependency>

2.使用并测试
这里主要测试了四种情况:

常规数字构成的公式
公式中分母为0
布尔表达式
逻辑运算
具体测试代码如下:

import com.singularsys.jep.Jep;
import com.singularsys.jep.JepException;

public class jepTest {

public static void main(String[] args) {

try {
Jep jep=new Jep();

//常规公式
String formula1 = "3x+4y+-5z";
jep.addVariable("x",1);
jep.addVariable("y",1);
jep.addVariable("z",1);
jep.parse(formula1);
System.out.println("测试公式1:"+jep.evaluate().toString());

//公式中分母为0
String formula2 = "3/0";
jep.parse(formula2);
System.out.println("测试公式2:"+jep.evaluate().toString());

//布尔表达式
String formula3 = "3>=0";
jep.parse(formula3);
System.out.println("测试公式3:"+jep.evaluate().toString());

//逻辑运算
// String formula4 = "1&&0";
// String formula4 = "1||0";
String formula4 = "1!=1";
jep.parse(formula4);
System.out.println("测试公式4:"+jep.evaluate().toString());

} catch (JepException e) {
e.printStackTrace();
}


}

}


运行结果:

测试公式1:2.0
测试公式2:Infinity
测试公式3:true
测试公式4:false
————————————————

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/qq_42391904/article/details/115353191

 

标签:jep,String,公式,字符串,import,数学计算,表达式
From: https://www.cnblogs.com/qingzhen/p/18335035

相关文章

  • 二进制序列化和字符串序列化
    经常用json字符串序列化,倒是忘记也可做二进制序列化。在文件上传时,如果序列化为字符串,再按字符串上传,这样是否会数据量变大呢?今天试了试两种序列化方式:dotnet自带的BinaryFormatter和Newtonsoft privatevoidbutton3_Click(objectsender,EventArgse){......
  • mysql的sql怎么拼接字符串类型?
    在MySQL中,字符串拼接通常不使用+号,而是使用CONCAT()函数。MySQL并不支持用+号直接进行字符串接。在MySQL中,+号用于数值运算。使用CONCAT()函数进行字符串拼接示例:SELECTCONCAT('Hello','','World')ASgreeting;结果:+----------+|greeting|+---......
  • 当密码包含特殊字符时写入连接字符串
    我正在将SQLalchemy用于Python项目,并且希望有一个整洁的连接字符串来访问我的数据库。例如:engine=create_engine('postgresql://user:pass@host/database')问题是我的密码包含一系列特殊字符,当我尝试连接时,这些字符被解释为分隔符。我意识到我可以使用engin......
  • Unity引擎字符串内存布局
      Unity引擎的字符串有三种存储方式:堆:分配在堆上内嵌:一个栈上的内存数据。默认25字节,可以放长度最多24的字符串。这个长度定义为STACK_LENGTH. 外部  重点主要是前两种,这是一种优化方法,对于非常短的字符串,可以直接使用栈数据而不需要再次内存分配。C++伪代......
  • P3501 [POI2010] ANT-Antisymmetry 反对称 题解(字符串哈希+二分)
    原题题意若一个由010101组成的字符串将000和......
  • 学习笔记 String类案例练习 1.模拟用户登录 2.统计字符串英文字母大小写及数字个数
    目录案例一模拟用户登录需求:代码: 案例二统计字符串英文字母大小写及数字个数需求:代码:案例一模拟用户登录需求:已知正确的用户名和密码,请用程序实现模拟用户登录。总共给三次机会,登录之后,给出相应的提示代码:publicstaticvoidmain(String[]args){......
  • C/C++ 字符串常量的注意事项
    在C/C++中使用字符串常量时,需要注意以下几个关键点,以确保代码的正确性和高效性:存储位置:字符串常量通常存储在只读存储区(如文本段),这意味着它们不能被修改。尝试修改字符串常量将导致未定义行为,通常是程序崩溃。类型:在C中,字符串常量的类型是char数组的形式,但其末尾自动......
  • Leetcode每日一题 20240727 3106.满足约束且字典序最小的字符串
    题目描述给你一个字符串s和一个整数k。定义函数distance(s1,s2),用于衡量两个长度为n的字符串s1和s2之间的距离,即:字符‘a’到‘z’按循环顺序排列,对于区间[0,n-1]中的i,计算所有「s1[i]和s2[i]之间最小距离」的和。例如,distance(“ab”,......
  • 格式化字符串(summer2024_fmt)
    参考博客[参考博客]:https://blog.csdn.net/ysy___ysy/article/details/135700140[参考博客]:https://blog.csdn.net/2402_83422357/article/details/139180404戳此切大佬博客https://blog.csdn.net/Morphy_Amo/article/details/122215773https://blog.csdn.net/song_lee/......
  • Python 字节串转Hex字符串(一个久远的问题点总结)
    时间:2024.07.30作者:Yuan  这是一个今天看来似乎有点久远的问题,但是值得被记录和澄清一下!  那是在2022年1月份参与的一个项目中遇到的问题,大概需求是利用SHT40-AD1B-R2芯片,读取环境温度。其实就是通过i2c与这个温度传感器建立通讯,然后读取温湿度信息,对于上位机的......