Mam listę obiektów, które muszę posortować według pola, powiedzmy Wynik. Bez zastanawiania się napisałem nową klasę, która implementuje komparator, który wykonuje zadanie i działa.
Patrząc wstecz na to, zastanawiam się, czy zamiast tego powinienem mieć moją klasę implementującą Comparable, zamiast tworzyć nową klasę, która implementuje Comparator. Wynik jest jedynym polem, w którym obiekty zostaną uporządkowane.
Co zrobiłem do zaakceptowania jako praktyka?
Czy właściwe podejście jest „Najpierw niech klasa implementuje porównywalną (dla naturalnego porządku), a jeśli wymagane jest alternatywne porównanie pól, to utwórz nową klasę, która implementuje komparator”?
Jeśli (2) powyżej jest prawdziwe, to czy oznacza to, że należy wdrożyć komparator dopiero po tym, jak klasa implementuje Comparable? (Zakładając, że jestem właścicielem oryginalnej klasy).
źródło
Użyj,
Comparable
jeśli chcesz zdefiniować domyślne (naturalne) zachowanie porządkowe danego obiektu, powszechną praktyką jest użycie do tego technicznego lub naturalnego (bazy danych?) Identyfikatora obiektu.Użyj,
Comparator
jeśli chcesz zdefiniować zewnętrzne zachowanie porządkowania sterowane , może to zastąpić domyślne zachowanie kolejności.źródło
Comparable
oznacza, że określam naturalny porządek?” , to dało mi odpowiedź, której szukałem. Dzięki :)Zastosowanie
Comparable
:Zastosowanie
Comparator
:Comparable
.Comparable
) zachowanie.źródło
Porównywalne -
java.lang.Comparable: int compareTo(Object o1)
Porównywalny przedmiot jest w stanie porównać się z innym obiektem. Sama klasa musi implementować interfejs java.lang.Comparable, aby móc porównać jej instancje.
only one sort sequence
oparciu o właściwości instancji. DAWNY:Person.id
Komparator -
java.util.Comparator: int compare(Object o1, Object o2)
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ć interfejs java.util.Comparator.
many sort sequence
i nazwać każdy, na podstawie właściwości instancji. DAWNY:Person.id, Person.name, Person.age
Przykład:
W przypadku Java 8 Lambda: Comparator patrz mój post.
źródło
Porównywalne powinno być używane podczas porównywania wystąpień tej samej klasy.
Komparatora można użyć do porównania wystąpień różnych klas.
Porównywalny jest implementowany przez klasę, która musi zdefiniować naturalne uporządkowanie swoich obiektów. Podobnie jak String implementuje porównywalny.
W przypadku, gdy ktoś chce innej kolejności sortowania, może zaimplementować komparator i zdefiniować własny sposób porównywania dwóch instancji.
źródło
Jeśli sortowanie obiektów musi opierać się na naturalnym porządku, użyj Porównywalny, a jeśli sortowanie musi być wykonane na atrybutach różnych obiektów, użyj Komparatora w Javie.
Główne różnice między Porównywalnym a Komparatorem:
źródło
Komparator robi wszystko, co porównywalne, plus więcej.
Znalazłem najlepsze podejście do używania komparatorów jako klas anonimowych w następujący sposób:
Możesz utworzyć wiele wersji takich metod bezpośrednio w klasie, którą planujesz posortować. Możesz więc mieć:
sortAccountsByPriorityAndType
itp...
Teraz możesz używać tych metod sortowania w dowolnym miejscu i ponownie używać kodu. To daje mi wszystko, co można by porównać, plus więcej ... więc nie widzę żadnego powodu, by używać porównywalnego w ogóle.
źródło
Powiedziałbym:
źródło
Poniższe punkty pomogą Ci zdecydować, w których sytuacjach należy użyć Porównywalnego, a w których Komparator:
1) Dostępność kodu
2) Kryteria sortowania pojedynczego i wielokrotnego
3) Arays.sort () i Collection.sort ()
4) Jako klucze w SortedMap i SortedSet
5) Więcej Liczba klas a elastyczność
6) Porównania międzyklasowe
7) Porządek naturalny
Aby uzyskać bardziej szczegółowy artykuł, możesz zapoznać się z Kiedy używać porównywarki, a kiedy porównywać
źródło
źródło
Jeśli potrzebujesz sortowania w porządku naturalnym - Porównywalne przez użytkownika JEŚLI potrzebujesz sortowania zamówień niestandardowych - użyj komparatora
Przykład:
Sortowanie według porządku naturalnego byłoby oparte na identyfikatorze, ponieważ byłoby unikalne, a sortowanie według niestandardowego porządku obejmowałoby nazwę i dział.
Odniesienia:
Kiedy klasa powinna być porównywalna i / lub porównawcza? http://javarevisited.blogspot.com/2011/06/comparator-and-comparable-in-java.html
źródło
Pojawiło się tutaj podobne pytanie: kiedy klasa powinna być porównywalna i / lub porównawcza?
Powiedziałbym tak: Wdrażanie porównywalnego do czegoś w rodzaju naturalnego uporządkowania, np. Na podstawie wewnętrznego identyfikatora
Zaimplementuj komparator, jeśli masz bardziej złożony algorytm porównujący, np. Wiele pól i tak dalej.
źródło
Comparable
.Porównywalne: zawsze,
gdy chcemy przechowywać tylko jednorodne elementy i wymagany jest domyślny naturalny porządek sortowania, możemy przejść do
comparable
interfejsu implementującego klasy .Komparator:
Zawsze, gdy chcemy przechowywać elementy jednorodne i niejednorodne i chcemy sortować w domyślnej niestandardowej kolejności sortowania, możemy przejść do
comparator
interfejsu.źródło
Moje potrzeby były sortowane według daty.
Tak więc użyłem Porównywalnego i to dla mnie z łatwością zadziałało.
Jednym z ograniczeń związanych z Porównywalnym jest to, że nie można ich używać do kolekcji innych niż Lista.
źródło
Jeśli posiadasz klasę, lepiej idź z porównywalnym . Ogólnie rzecz biorąc, komparator jest używany, jeśli nie jesteś właścicielem klasy, ale musisz jej użyć jako TreeSet lub TreeMap, ponieważ komparator może zostać przekazany jako parametr w konstruktorze TreeSet lub TreeMap. Możesz zobaczyć, jak korzystać z komparatora i porównywalnego w http://preciselyconcise.com/java/collections/g_comparator.php
źródło
W jednym z wywiadów poproszono mnie o sortowanie określonego zakresu liczb w czasie lepszym niż nlogn. (Bez sortowania według liczenia)
Zaimplementowanie porównywalnego interfejsu na obiekcie pozwala algorytmom niejawnego sortowania na użycie nadpisanej metody compareTo w celu uporządkowania elementów sortowania i byłby to czas liniowy.
źródło
Porównywalny to domyślny naturalny porządek sortowania podany dla wartości liczbowych rosnąco, a dla łańcuchów - kolejności alfabetycznej. na przykład:
Komparator to niestandardowa kolejność sortowania zaimplementowana w niestandardowej klasie myComparator przez zastąpienie metody porównania, np .:
źródło
Bardzo prostym podejściem jest założenie, że dana klasa encji będzie reprezentowana w bazie danych, a następnie w tabeli bazy danych potrzebny będzie indeks złożony z pól klasy encji? Jeśli odpowiedź brzmi tak, zastosuj porównywanie i użyj pól indeksu do naturalnej kolejności sortowania. We wszystkich innych przypadkach użyj komparatora.
źródło
Moja biblioteka adnotacji do implementacji
Comparable
iComparator
:Kliknij łącze, aby zobaczyć więcej przykładów. http://code.google.com/p/compamatic/wiki/CompamaticByExamples
źródło