在Java中以变量形式计算包含变量的表达式

时间:2014-12-24 15:29:33

标签: java string parsing variables expression

我已经使用了EvalEx(https://github.com/uklimaschewski/EvalEx)并对其进行了修改以制作一个没有数学包的计算器。  所以现在它可以从用户那里获得字符串形式的输入并打印出结果。

像这样:

Enter an Expression: ADD(DIV(SIN(FACT(3)),CEIL(TAN(MUL(1.5,FIB(4))))),GCD(2,10)) 
The Result is: 1.94    

现在用户将输入包含变量而不是常量的表达式

ADD(DIV(SIN(FACT(X1)),CEIL(TAN(MUL(1.5,FIB(X2))))),GCD(Y,10))    

,运行时整体代码应如下所示:

Enter an Expression: ADD(DIV(SIN(FACT(X1)),CEIL(TAN(MUL(1.5,FIB(X2))))),GCD(Y,10))     
Enter Variables: X1,X2,Y    
Enter values for X1, X2 and Y by this order(separate the values by space): 3 4 2    
The Result is: 1.94        

请注意,用户首先输入表达式,然后告诉机器有什么变量(如"输入变量:x1,x2,y") 我也必须使用客观的编程概念(因此表达式的每个函数及其常量或变量都应保留为对象)

那么如何更改EvalEx中的现有代码以使程序识别变量?

1 个答案:

答案 0 :(得分:1)

您可以设置一个Map<String, Double>,将变量名称与值相关联,如下所示:

Map<String, Double> values = new HashMap<String, Double>();
values.put("X", 13.5);
values.put("Y", -3);

然后,您可以用相应的值替换表达式中的所有变量,如下所示:

for (Map.Entry<String, Double> entry : values.entrySet())
    expression = expression.replace(entry.getKey(), entry.getValue().toString());

然后,您只需将您已编写的方法应用于expression

这种方法很简单,但不是很健壮。例如,如果您的某个变量名称为"C",则会使函数"CEIL"陷入混乱。因此,您可以坚持所有变量都以"_"或类似的东西开头。