2013-02-14 9 views
23

Szukałem czegoś podobnego do zdolności Java TreeSet do otrzymywania niestandardowego komparatora w czasie tworzenia instancji, więc nie musiałem używać domyślnych kryteriów równości (i kodu skrótu) obiektu.Java HashSet z niestandardowymi kryteriami równości?

Najbliższe, co mogłem wymyślić, to zawinąć moje obiekty do prywatnej klasy niestandardowej, ale to wydaje się być hacky :(To kończy się jako powracający temat podczas programowania, więc zastanawiałem się, czy jest coś, co jest już dostępne dla nam wykorzystać. Może w bibliotekach commons?

Dzięki

+2

Napisałeś HashSet w tytule, ale TreeSet w tekście? Czego chcesz teraz? – AlexWien

+0

Jeśli pojawia się często, to być może możesz rzucić własną? Guava musi martwić się o to, że programiści niewłaściwie używają interfejsów API. –

Odpowiedz

10

Nope, znalazłeś dokładnie rozwiązanie Miałeś użyć.

Nawet TreeSet, to frowned upon do stosowania kryteriów porównawczych, które nie są kompatybilne z equals:

Zauważ, że kolejność utrzymywany przez uporządkowany zestaw (czy wyraźne komparator jest przewidziany) musi być zgodny z równymi, jeżeli sortowane zestaw jest poprawnie zaimplementować interfejs Set.

(nie wiem o Apache Commons, ale Guava specificallyrejected wnioski o tego typu rzeczy).

+1

"Nie wiem o Apache Commons, ale Guava wyraźnie odrzucił prośby o tego typu rzeczy". Ciekawy –

3

Jesteś poprawne, jeśli chcesz używać żadnego z Trees (TreeMap, TreeSet) dodane obiekty muszą zaimplementować Comparable.

W przypadku typów pierwotnych Java rozwiązała to za Ciebie.
Dla obiektów niestandardowych masz 3 możliwości:

  1. jeden z twoich obiektu ma już niepowtarzalny identyfikator prymitywnego typu lub rodzaju, które już implementuje compareTo() (jak String) następnie użyć tego pola do CompareTo, jeśli wartości innych nie są ważne dla równości. (Ale potem equals() należy również używać tylko to jedno pole)

  2. Zastosowanie EqualsBuilder z Apache: Działa to z refleksji, a nie jest najszybszym rozwiązaniem

  3. napisać to swój własny, przeczytać kilka poradnik Jak zrobić: np:

Josh Bloch: Efektywna Java 2nd Edition

Ale nie zapominaj, że equals() i compareTo() muszą być kompatybilne (i hashCode()), aby nie naruszyć umowy równej. (Sama umowa jest mniej zrozumiała, ale staje się jasne, jeśli wypełnisz jeden z tutoriali.)

Albo zapomnij o tym wszystkim i użyj HashSet, HashMap.

2

Istnieje kilka zewnętrznych struktur kolekcji, które umożliwiają niestandardową logikę równości.Jest to idealne rozwiązanie dla nadrzędności dla obiektów, których nie można zmienić.

mapy skarb w/zestawy obsługują niestandardowych strategii mieszaja, pozwala na dostrojenie na podstawie zbiorów cech wejścia danych. Ta funkcja umożliwia także definiowanie funkcji mieszania, gdy jest to niemożliwe, aby zastąpić Object.hashCode().

Aby to achive każdy typ, który potrzebuje standardową korekcję należy implementować interfejs EqualsAndHashCorrection HE-Collection. Ten interfejs definiuje metody hashCodeInHeCollection() i equalsInHeCollection (Object), które służą jako korekta dla nieprawidłowych zaimplementowanych metod hashCode() i equals (Object).

Powiązane problemy