2011-09-22 56 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。不要依賴樹結構,而是使用堆棧和隊列。其優點是這些數據結構並不複雜。缺點是執行該算法的任何錯誤可能很容易被忽略,因爲您需要徹底瞭解所涉及的操作以瞭解您的實現是否正確。