2011-12-06 70 views
1

我有一組對象,我無法通過覆蓋它們的equals或hashCode函數來修改它們(它並不像我想要的那樣),但爲此我確實有一個比較器,它的行爲如我所願。有沒有一套我可以使用,利用比較不允許重複,但是當迭代遍歷插入順序?在java中是否有一個標準設置可以爲比較檢查進行等式檢查,但在迭代順序中進行迭代?

本質上我正在尋找TreeSet和LinkedHashSet之間的交叉。就像一個LinkedTreeSet!

回答

2

你有沒有考慮過創建一個包裝對象的類,並且實現了一個像你期望的那樣的equals/hashCode函數?有點麻煩,但你似乎有嚴重的限制。另外,如果你最終做了這個或找到了更適合的東西,請確保正確評論它,否則下一個人會對equals/hashCode方法做出錯誤的假設!

PS:一個TreeSet仍然使用等於rule out duplicates

+1

我認爲這是加的javadoc的錯誤,因爲類文件說:「一個TreeSet實例使用對所有元素進行比較它的compareTo(或compare)方法,所以這個方法認爲相等的兩個元素從集合的角度來看是相等的「。 –

+0

這實際上是我目前的解決方案 - 它的工作原理 - 但我想知道是否有一個數據結構,不需要包裝類。 – Zugwalt

+0

織補。你是對的。看着代碼,然後編寫一個測試程序以防萬一。在......之前從未發現過基本的java javadoc錯誤。 – Miquel

0

TreeSet不會做你想做的,無論是。它不使用比較器來確定重複項;它只用它來保存排序順序。來自Set docs

不包含重複元素的集合。更正式地,集合不包含e1和e2這樣的元素對,使得e1.equals(e2)和至多一個空元素。

特別地,在該TreeSet docs

公共布爾添加(E E)

將指定元素添加到這個組,如果它不是已存在。更正式地說,如果該集合不包含元素e2(e == null?e2 == null:e.equals(e2)),則將指定的元素e添加到該集合中。如果此集合已包含該元素,則該呼叫將保持集合不變並返回false。

我不認爲有任何解決方法Set將使用.equals()方法的對象。您將不得不擴展該類並覆蓋.equals()方法,或者創建一個包含要放入該集合的對象的類,如Miquel建議的那樣。

+1

我認爲這是add的javadoc中的一個錯誤,因爲類文檔中提到:「TreeSet實例使用其compareTo(或compare)方法執行所有元素比較,因此通過此方法認爲相等的兩個元素是該集合的立場,平等「。 –

0

阿帕奇的commons-collections有一個ListOrderedSet。這聽起來像你想要的。

裝飾另一個Set以確保迭代次序保留 並由迭代器使用。

但這不會使用比較來檢查重複...

相關問題