2011-09-22 54 views
0

我有一个multidimension arrayList,我问用户一个公式,而不是我评估它。问题是,我获取用户输入的是这样的:我将如何评估某个公式?

((a1+a2)/12)*a3 

问题是,A1和A2和A3是指列,我必须把它计算到一定值,它和我完全失去了对如何解决这个问题的任何建议或指导将是伟大的。此计算值也必须每次更新Update列中的值。事情是公式不是硬编码的。

+0

这是功课吗? – James

+0

不,这不是作业 –

+0

那么你为什么这样做?已经有电子表格。 –

回答

3

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

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

tree

+0

“应该”太强。这是一种可能的方法,但我认为OP将从头开始实施解析器。 –

+0

@StephenC:我编辑它。实际上你是对的。 – Heisenbug

+0

我还没有学过二叉树 –

0

您将需要把公式变得像一个Binary Expression Tree。这应该不是很难。

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

3

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

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

+0

+1 - 查找现有解决方案。 –

1

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