我如何评估某个公式?

时间:2011-09-22 22:23:59

标签: java arraylist

我有一个multidimension arrayList,我问用户一个公式,而不是我评估它。问题是我得到这样的用户输入:

  ((a1+a2)/12)*a3

问题是a1和a2和a3引用了列,我必须将它评估为某个值,我完全迷失了如何处理这个问题,任何建议或指导都会很棒。此计算值也必须在每次更新任何列时更新。事情是公式不是硬编码。

4 个答案:

答案 0 :(得分:3)

一种可能性就是编写一种解析器。最好使用binary tree结构来表示表达式,而不是列表。

每个非叶节点都是一个操作,每个叶子都是操作数。

tree

答案 1 :(得分:3)

就个人而言,我会尽力避免所有解析内容,并寻找一个允许您使用自己的变量解析器的EL库。您需要做的就是将变量连接到您的支持模型。 (在您的情况下,分割单词/字母边界,并查找单元格内容。)

这也允许您通过简单地将它们暴露给EL引擎来包含任意函数。像OGNL,MVEL等等可能是一个很好的起点。似乎更容易。

答案 2 :(得分:1)

Heisenbug's suggestion的替代方法是尝试Dijkstra的shunting-yard algorithm。您可以使用堆栈和队列,而不是依赖树结构。优点是所涉及的这些数据结构并不十分复杂。缺点是可能很容易错过实现算法的任何错误,因为您需要彻底了解所涉及的操作,以了解您的实现是否正确。

答案 3 :(得分:0)

您需要将公式转换为Binary Expression Tree之类的内容。这不应该 很难。

然后,您将需要遍历此树以评估开始时的表达式值以及每次arrayList中的值更改时。首先集中精力构建树,并在评估时获得正确的值。不要忘记负数和变量!在此之后,观察arrayList的变化应该是微不足道的。