【问题标题】:calculate values of an array using operators in another array使用另一个数组中的运算符计算数组的值
【发布时间】:2013-09-03 14:11:09
【问题描述】:

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

【问题讨论】:

  • 在您的示例中,您从不使用第二个 -。您应该比文字数少 1 个运算符
  • 我会说,use some freely available library 来评估数学表达式。
  • 感谢@AudriusMeškauskas,JEval 可以解决我的问题!我会回来的!
  • @AudriusMeškauskas JEval 做了这些事情!非常感谢

标签: java arrays math operators


【解决方案1】:

将所有临时值替换为乘法和除法的计算结果,并在最后添加/减去剩余。

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

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

例子:

Simple calculator

【讨论】:

  • 您可以将变量更改为双精度数。如果您使用除法,它们会更好,但这不是您的应用程序中的主要问题。
  • 是的,我知道我的方法有问题。 Pliz你能举个例子吗?不要忘记数组中可以有超过 20 个值!
  • 在我的回答中,上面是用java编写的计算器的链接。
  • 您不需要在表中存储临时结果;)。用乘法/除法的结果替换实际数字。
【解决方案2】:

Edsger Dijkstra 在 1961 年发布了一个解决方案。它被称为Shunting Yard Algorithm。如果您有兴趣,可以获取原始论文的副本here (pdf)。它考虑了运算符的优先级,而不是像您原来的解决方案那样简单地从左到右计算。我怀疑 Evaluator 类使用了 Shutting Yard 算法的一些变体来正确计算解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-02
    • 1970-01-01
    • 1970-01-01
    • 2023-01-25
    • 2023-02-06
    • 1970-01-01
    • 2022-06-28
    • 1970-01-01
    相关资源
    最近更新 更多