2014-12-24 58 views
1

我已经使用EvalEx(https://github.com/uklimaschewski/EvalEx)并对其进行了修改,使其没有像数学软件包那样的计算器。 所以现在它可以从用户获得字符串形式的输入并打印出结果。评估在Java中包含变量的字符串形式的表达式

这样的:

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   

请注意,用户首先输入表达式,然后告诉机器什么是t他变量(如在“输入变量:x1,x2,y”) 也我不得不使用客观编程概念我可以更改EvalEx中的现有代码以使程序识别变量吗?

回答

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"。出于这个原因,你可以坚持所有的变量都以"_"或类似的东西开头。

+0

谢谢你的回答 但你能告诉我另一种方式,而无需使用map和hashmap吗? 如果我可以通过更改EvalEx中的eval方法来做到这一点会好得多,因为我应该避免使用包 实际上我正在寻找方法来使代码在没有任何准备好的软件包(如地图,数学等)的情况下工作(除必需类似java.lang的当然) – Vicarious

+0

你不必使用'HashMap'。你可以使用一对数组来代替(一个'String []'用于变量名,一个'double []'用于相应的值)。但是我不知道你对“Map”有什么反应 - 它在java.util中,所以它几乎没有异国情调!如果您希望我们帮助您修改“EvalEx”的代码,您将不得不在该问题中包含该方法的代码。 –

+0

我没有任何反对地图 我刚开始学习java,所以我认为这是一个包,我不应该使用 和这个链接到代码,这基本上是它应该看起来像 https: //www.dropbox.com/sh/0zeqdc6sn5ouvcm/AAAdjl9XCf6TQrNqyu5wUCJTa?dl=0 – Vicarious

相关问题