一、通过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