我有2个阵列:
int[] values = {1, 2, 3, 4, 5, 6};
int[] operators = {PLUS, MINUS, MULTIPLY, MINUS, DIVIDE, PLUS}
括号中的大写单词是定义的常量。
我想使用相应的运算符(+, - ,*,/,+)来评估values array
中的值:
1 + 2 - 3 * 4 / 5 + 6 = 1 + 2 - (3*4/5) + 6 = 6.6 // expected result
我已经创建了一个方法(带有switch case
),基于上面的常量来了解我应该使用的运算符。
public static int evaluate(int a, int b, int op) {
int result = 0;
switch (op) {
case PLUS:
result = a + b;
break;
case MINUS:
result = a - b;
break;
/* .... */
}
return result;
}
但是正如你所看到的,使用这种方法结果将是错误的:这就是我得到的原因:
1+2-3*4/5+6 = ((((1+2)-3)*4)/5)+6 = 0*4/5+6 = 0 / 5 + 6 = 0 + 6 = 6 // not the expected result
有人可以帮帮我吗?
解决方案:JEval
@AudriusMeškauskas的链接包含(强大的)库列表。我读了JEval
features,我测试了它,它就像一个魅力!
Evaluator evaluator = new Evaluator();
System.out.println("eval : " + evaluator.evaluate("1 + 2 - 3 * 4 / 5 + 6"));
输出:6.6
答案 0 :(得分:2)
Edsger Dijkstra于1961年发布了一个解决方案。它被称为Shunting Yard Algorithm。如果您感兴趣,可以获得原始论文的副本here(pdf)。它考虑了运算符的优先级,而不是像原始解决方案那样简单地从左到右计算。我怀疑Evaluator类使用Shunting Yard算法的一些变化来正确计算解决方案。
答案 1 :(得分:0)
将所有临时值替换为乘法和除法的计算结果,最后是add / substarct rest。
问题不在于源代码的这一部分,而是扩展了应用程序。
您的解决方案会添加/减去/乘以/除以前一个结果的下一个数字。你必须修改计算方法。
示例: