2013-04-15 140 views
8

我有一個Collection myObject的集合。我只想在集合中沒有這樣的元素的情況下添加一個元素。java獨特元素集合

我已經覆蓋了myObject的equals方法。它檢查它的20個屬性的相等性。

但是在收集的情況下,我想提出僅基於這些屬性中的一個平等檢查(並因此添加)。

也許我的架構是有缺陷的,我不應該有平等的兩個定義,而是應該有2個不同的對象。

但是,沒有太多的重構,是否有可能從這裏實現我想要的?也就是說,我想要某種Set集合,在那裏我可以告訴如何進行比較檢查。這與Collection.sort()方法類似,您可以在其中提供比較器以檢查比較結果。

+0

然後呢?我如何使用這個比較器? – jbenz

+1

看看SortedSet。也許這會對你有用 –

+0

SortedSet可能工作。不過,我會非常小心,因爲你的比較器不會與等於和/或完全一致。 – Thilo

回答

8

HashSet它將存儲唯一值。從這裏的評論,你必須重寫哈希碼和等於提供每個對象的唯一性的方法。您可以閱讀這兩種方法之間的關係here

+0

你需要工作hashCode和等於(至少後者不是這裏的情況)。 – Thilo

+1

基於什麼獨特?這就是問題所在。當我實例化哈希集時,我可以提供一種方法來判斷兩個元素是否唯一? – jbenz

+0

@jbenz編輯後有意義嗎? –

2

你正在尋找一個Set及其實現方式之一。

+0

你會需要一個不使用'equals'的。 – Thilo

2

不能使用現有的容器來實施唯一在這裏,因爲他們都希望使用equals

如果它只有一個屬性,則可以使用Map,並將該屬性作爲關鍵字。 這將只允許該屬性的每個值有一個條目。

equalshashCode旨在與類別使用。你應該改變你的設計。也許稱自己的平等(你現在擁有的那個)別的東西。也許不要直接將這些東西放到集合中,而是包裝到某種適配器中。

+0

我可以使用我自己的集合,從set繼承,我重寫負責平等測試的方法? – jbenz

+0

是的,你可以。 – Thilo

0

通過使用一個TreeSet(比較比較)你不需要依靠「等於/的hashCode」執行。類似地,如果你的集合是一個列表,你可以使用比較器Collections.sort(List list,Comparator c)對它進行排序;