2013-08-30 29 views
1

我有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 

有人能帮助我吗?

SOLUTION:JEval

@AudriusMeškauskas的链接中包含的(强大)库列表。我读JEval features,我测试了它,它的功能就像一个魅力!

Evaluator evaluator = new Evaluator(); 
System.out.println("eval : " + evaluator.evaluate("1 + 2 - 3 * 4/5 + 6")); 

输出6.6

+0

在你的例子中,你永远不会使用第二个 - 。你应该有1个运营商少于文字的数量 – Cruncher

+1

我会说,[使用一些免费提供的库](http://stackoverflow.com/questions/7258538/free-java-library-for-evaluating-math-expressions)评估数学表达式。 – h22

+0

感谢@AudriusMeškauskas,JEval可能解决我的问题!我会回来 ! –

回答

0

与计算结果FO乘除并在结束替换的临时值添加/ substarct休息。

问题不在于源代码的这一部分,而是您扩展了您的应用程序。

您的解决方案添加/减法/乘/除以前一个结果的下一个数字。你必须修改计算方法。

例子:

Simple calculator

+0

您可以将变量更改为双打。如果您使用该部门,他们会更好,但这不是您应用程序中的主要问题。 – Pawel

+0

是的,我知道我错了我的方法。普利兹你能举个例子吗?不要忘记,你可以在数组中有超过20个值! –

+0

用java编写的计算器链接位于上方,在我的答案中。 – Pawel

2

Edsger Dijkstra算法在1961年出版了一本解决这个这就是所谓的Shunting Yard Algorithm。如果您有兴趣,可以提供原始文件的副本here(pdf)。它考虑到了运营商的优先级,而不是像从原来的解决方案那样简单地从左到右进行计算。我怀疑Evaluator类在调车场算法中使用了一些变化来正确计算解决方案。