2011-08-09 81 views
3

我有一個TreeBasedTable對象來自Guava(Gooogle Collections)。它的形式是TreeBasedTable<k1, k2, v>。​​和k2實施Comparable。現在,當我顯示錶格時,我希望用戶能夠通過不同的方式來改變值的順序。Java排序番石榴TreeBasedTable

我嘗試的方法是迭代整個表,併爲每個值更改Compare方法中使用的變量。問題在於它通過一次循環,然後返回一個NullPointerException,我認爲我已經縮小了嘗試改變順序,同時迭代它(新手錯誤,我知道)。

所以我想知道,什麼是重新排序這個表的好方法?

+1

你是如何顯示的表給用戶的一個修改過比較後,從以前的一個新的?它是通過基於Web的環境,還是將它用作Swing應用程序的TableModel?根據你是否一次拉動整個表格,或者是否需要遍歷整個表格,我會選擇不同的解決方案。 – deterb

回答

3

如果你只是創建一個新的TreeBasedTable,創建一個不同的比較對象,然後通過公共putAll方法將其複製到它?每個元素的放置將採用log(N),所以總時間應該是N log(n),這大約是我期望重新排序的時間。

3

您應該重新創建TreeBasedTable併爲其提供另一個比較器。請參閱guava documentation。還要注意,這在內部使用必須使用適當的比較器進行排序的樹(當您構建樹時,比較器是已知的,以便以特定方式構建樹)。提供其他比較器會導致構建新樹。如果這不是你想要的行爲,你應該考慮使用其他數據結構。

+0

鏈接已死... –

0

使用TreeBasedTable.create(TreeBasedTable<R, C, ? extends V>)以創建已通過切換自己的標誌