Java 使用另一个数组中的运算符计算数组的值

Java 使用另一个数组中的运算符计算数组的值,java,arrays,math,operators,Java,Arrays,Math,Operators,我有两个阵列: int[] values = {1, 2, 3, 4, 5, 6}; int[] operators = {PLUS, MINUS, MULTIPLY, MINUS, DIVIDE, PLUS} 括号中的大写单词是定义的常量。 我想使用相应的运算符(+、-、*、/、+)来计算值数组中的值: 1 + 2 - 3 * 4 / 5 + 6 = 1 + 2 - (3*4/5) + 6 = 6.6 // expected result 我已经创建了一个方法(带有一个开关盒),它基于

我有两个阵列:

int[] values = {1, 2, 3, 4, 5, 6};
int[] operators = {PLUS, MINUS, MULTIPLY, MINUS, DIVIDE, PLUS}  
括号中的大写单词是定义的常量。 我想使用相应的运算符(+、-、*、/、+)来计算
值数组中的值

1 + 2 - 3 * 4 / 5 + 6 = 1 + 2 - (3*4/5) + 6 = 6.6 // expected result
我已经创建了一个方法(带有一个
开关盒
),它基于上述常量来知道我应该使用哪个操作符

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的链接包含一个(强大的)库列表。我读过,我测试过,我觉得它很有魅力

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

输出
6.6

将所有临时值替换为乘法和除法的计算结果,并在末尾添加/减法余数

问题不在源代码的这一部分,您已经扩展了应用程序

您的解决方案将下一个数字与上一个结果相加/相减/相乘/相除。你必须修改计算方法

例如:


Edsger Dijkstra在1961年发布了解决方案。它叫“世界杯”。如果您感兴趣,可以提供原始论文的副本(pdf)。它考虑了操作符的优先级,而不是像最初的解决方案那样简单地从左到右计算。我怀疑Evaluator类使用了调车场算法的一些变体来正确计算解决方案。

在您的示例中,您从未使用第二个-。要计算数学表达式,您应该比literalsI所说的数字少1个运算符。谢谢@AudriusMeškauskas,JEval可能会解决我的问题!我会回来的@AudriusMeškauskas JEval做了这件事!非常感谢,您可以将变量更改为双倍。如果你使用除法,它们会更好,但这不是你申请的主要问题。是的,我知道我的方法错了。你能举个例子吗?不要忘记数组中可以有20个以上的值!!在我的回答中,上面是用java编写的计算器的链接。您不需要在表中存储临时结果;)。用乘法/除法的结果替换实际数字。