Widziałem klasy, które implementują zarówno Porównywalną, jak i Porównawczą . Co to znaczy? Dlaczego miałbym używać jednego nad drugim?
java
comparator
comparable
Nick Heiner
źródło
źródło
Odpowiedzi:
Poniższy tekst pochodzi z książki Komparator vs Porównywalny
Porównywalny
Porównywalny przedmiot jest w stanie porównać się z innym obiektem. Sama klasa musi implementować
java.lang.Comparable
interfejs, aby móc porównać jej instancje.Komparator
Obiekt porównawczy może porównywać dwa różne obiekty. Klasa nie porównuje swoich instancji, ale instancje innych klas. Ta klasa porównawcza musi implementować
java.util.Comparator
interfejs.źródło
Implementacja
Comparable
oznacza „ Mogę porównać siebie z innym obiektem ” . Jest to zwykle przydatne, gdy istnieje jedno naturalne porównanie domyślne.Implementacja
Comparator
oznacza „ Mogę porównać dwa inne obiekty ” . Jest to zazwyczaj przydatne, gdy istnieje wiele sposobów porównywania dwóch wystąpień typu - np. Można porównać ludzi według wieku, imienia itp.źródło
Person
narzędzieComparable
, ponieważ nie możesz wtedy zmienić sposobu porównywania dwóch osób.Person
. 2) komparator, np.PersonAgeComparator
Który jest w stanie porównać dwa różne podmioty i zdecydować, który powinien zająć pierwsze miejsce w określonej kolejności sortowania. 3) Kod sortowania, który pobiera zbiór jednostek i komparatora, a następnie sortuje ten zbiór przy użyciu komparatora w celu określenia kolejności.Porównywalny pozwala klasie na implementację własnego porównania:
Dla porównania, komparator jest porównaniem zewnętrznym:
W obu wdrożeniach nadal możesz wybrać, z czym chcesz się porównywać . Dzięki rodzajom możesz to zadeklarować i sprawdzić w czasie kompilacji. Zwiększa to bezpieczeństwo, ale wyzwaniem jest też określenie odpowiedniej wartości.
Jako wskazówkę, generalnie używam najbardziej ogólnej klasy lub interfejsu, z którym można porównać ten obiekt, we wszystkich przypadkach użycia, jakie wyobrażam ... Jednak definicja niezbyt precyzyjna! :-(
Comparable<Object>
pozwala na użycie go we wszystkich kodach w czasie kompilacji (co jest dobre w razie potrzeby lub złe, jeśli nie, i tracisz błąd w czasie kompilacji); Twoja implementacja musi radzić sobie z obiektami i rzutować w razie potrzeby, ale w niezawodny sposób.Comparable<Itself>
jest bardzo surowa, wręcz przeciwnie.źródło
java.lang.Comparable
Aby zaimplementować
Comparable
interfejs, klasa musi implementować jedną metodęcompareTo()
int a.compareTo(b)
Musisz zmodyfikować klasę, której instancję chcesz sortować. Aby można było utworzyć tylko jedną sekwencję sortowania na klasę.
java.util.Comparator
Aby zaimplementować interfejs komparatora, klasa musi implementować jedną metodę
compare()
int compare (a,b)
źródło
Comparable
służy do zapewniania domyślnej kolejności obiektów danych, na przykład jeśli obiekty danych mają naturalny porządek.A
Comparator
reprezentuje samo zamówienie do określonego użytku.źródło
Comparable
jest zwykle preferowany. Ale czasami klasa już implementujeComparable
, ale chcesz posortować według innej właściwości. Wtedy jesteś zmuszony użyćComparator
.Niektóre klasy zapewniają w rzeczywistości
Comparators
typowe przypadki; na przykładString
s domyślnie rozróżniana jest wielkość liter podczas sortowania, ale istnieje również statycznyComparator
callCASE_INSENSITIVE_ORDER
.źródło
oto kilka różnic między komparatorem a porównywalnym, które znalazłem w sieci:
Jeśli widzisz logiczną różnicę między tymi dwoma, komparator w Javie porównuje dwa dostarczone mu obiekty, podczas gdy interfejs Comparable porównuje „to” odwołanie z określonym obiektem.
Porównywalny w Javie służy do implementacji naturalnego uporządkowania obiektów. W klasach Java API String, Date i wrapper implementują porównywalny interfejs.
Jeśli jakaś klasa implementuje porównywalny interfejs w Javie, wówczas zbiór tego obiektu List lub Array może być sortowany automatycznie przy użyciu metody Collections.sort () lub Array.sort (), a obiekt zostanie posortowany na podstawie naturalnej kolejności zdefiniowanej przez metodę CompareTo.
Obiekty, które implementują Comparable w Javie, mogą być używane jako klucze w posortowanej mapie lub elementy w posortowanym zbiorze, na przykład TreeSet, bez określania jakiegokolwiek komparatora.
strona: Jak korzystać z komparatora i porównywalnego w Javie? Z przykładem
Czytaj więcej: Jak korzystać z komparatora i porównywalnego w Javie? Z przykładem
źródło
Comparable
jest dla obiektów z naturalnym uporządkowaniem. Sam obiekt wie, jak ma być zamówiony.Comparator
dotyczy przedmiotów bez naturalnego uporządkowania lub gdy chcesz użyć innego uporządkowania.źródło
Różnica między interfejsami komparatora i porównywalnych
Comparable
służy do porównywania się z innym obiektem.Comparator
służy do porównania dwóch typów danych - obiektów.źródło
Jeśli widzisz, logiczną różnicą między tymi dwoma jest
Comparator
w Javie porównanie dwóch dostarczonych mu obiektów, podczas gdyComparable
interfejs porównuje „to” odniesienie z określonym obiektem.Comparable
w Javie służy do implementacji naturalnego uporządkowania obiektów. W klasach Java API String, Date i wrapper implementująComparable
interfejs.Jeśli jakakolwiek klasa zaimplementować
Comparable
interfejs w języku Java, a następnie kolekcję tego obiektu alboList
czyArray
mogą być sortowane automatycznie za pomocąCollections.sort()
lubArray.sort()
metodę i obiekt zostanie tam sortowane na podstawie kolejności określonej przez naturalnecompareTo
metody.Obiekty, które są implementowane
Comparable
w Javie, mogą być używane jako klucze w posortowanej mapie lub na przykład elementy w posortowanym zestawieTreeSet
, bez określania żadnegoComparator
.źródło
Moja biblioteka adnotacji do implementacji porównywalnego i komparatora:
Kliknij łącze, aby zobaczyć więcej przykładów. compamatic
źródło