gpt4 book ai didi

java - 获取带有数学表达式的字符串,将其解析为函数数学表达式以便稍后对其求值(Java)

转载 作者:行者123 更新时间:2023-12-02 07:44:08 32 4
gpt4 key购买 nike

我将此作为服务器响应:

“[(sin(1+3*4)+2)/7]+10”

此响应意味着 1、3、4、2、7 和 10 是 DB(mysql) 上的某种索引项,我需要对其进行多次评估。我在java中寻找一个好的lib,我发现exp4j、expr、jep和jeval就像数学表达式解析器,但我不知道在哪里可以找到获取这些“索引”的选项,因为服务器只是给我那个字符串,但是不要给我需要在数据库中查阅的“索引项”。请帮忙:(

额外:1、3、4、2、7和10是变量,我需要获取它(并不总是数字),因为这些变量名称是我在数据库中的索引。当我获得名称时,我创建一个 sql 查询来获取该变量的实际值。

是这样的...

ParseMath function = new ParseMath("[(sin(1+3*4)+2)/7]+10");
String[] variables = function.getVariables();

System.out.println(values) = 1, 3, 4, 2, 7, 10

后来...

String[] realValues = SqlQuery(variables);

for(int i=0; i<variables.lenght(); i++){
function.setValue(variable[i],realValue[i]);
}

double result = function.exec();

PS:我编写的函数和方法不存在,我只是将其作为我的问题的上下文......

最佳答案

大多数表达式解析器会将数字视为数字。如果您希望将它们视为变量,请用字母替换它们或为其添加前缀,即执行如下操作:

ParseMath function = new ParseMath(replaceVariables("[(sin(1+3*4)+2)/7]+10"));

其中replaceVariables将是这样的:

String replaceVariables(String expr) {
StringBuilder sb = new StringBuilder();
boolean wasDigit = false;
for (int i = 0; i < expr.length; i++) {
char c = sb.charAt(i);
if (c >= '0' && c <= '9') {
if (!wasDigit) {
sb.append('x');
}
wasDigit = true;
} else if (c == '[') {
c = '(';
} else if (c == ']') {
c = ')';
}
sb.append(c);
}
return sb.toString();
}

这应该将示例表达式转换为 ((sin(x1+x3*x4)+x2)/x7)+x10,这样更有可能被表达式解析器识别。

请注意,设置变量时需要执行相同的转换,即,如果服务器响应位于字符串数组 realValues 中,则需要执行与此类似的操作来设置它们:

for (int i = 0; i < realValues.length; i++) {
function.setValue("x" + i, Double.parseDouble(realValues[i]));
}
double result = function.exec();

关于java - 获取带有数学表达式的字符串,将其解析为函数数学表达式以便稍后对其求值(Java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11127599/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com