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?
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?
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.
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.
Person
narzędzie Comparable
, 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.Zabawne, kiedy podklasujesz siebie do podklasy, podklasa musi być również porównywalna i solidna (w przeciwnym razie złamałaby zasadę Liskova i spowodowała błędy w czasie wykonywania).
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)
Comparable
jest zwykle preferowany. Ale czasami klasa już implementuje Comparable
, 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ład String
s domyślnie rozróżniana jest wielkość liter podczas sortowania, ale istnieje również statyczny Comparator
call CASE_INSENSITIVE_ORDER
.
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
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óż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.
Jeśli widzisz, logiczną różnicą między tymi dwoma jest Comparator
w Javie porównanie dwóch dostarczonych mu obiektów, podczas gdy Comparable
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 albo List
czy Array
mogą być sortowane automatycznie za pomocą Collections.sort()
lub Array.sort()
metodę i obiekt zostanie tam sortowane na podstawie kolejności określonej przez naturalne compareTo
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 zestawie TreeSet
, bez określania żadnego Comparator
.
Moja biblioteka adnotacji do implementacji porównywalnego i komparatora:
public class Person implements Comparable<Person> {
private String firstName;
private String lastName;
private int age;
private char gentle;
@Override
@CompaProperties({ @CompaProperty(property = "lastName"),
@CompaProperty(property = "age", order = Order.DSC) })
public int compareTo(Person person) {
return Compamatic.doComparasion(this, person);
}
}
Kliknij łącze, aby zobaczyć więcej przykładów. compamatic