Mam prostą klasę
public class ActiveAlarm {
public long timeStarted;
public long timeEnded;
private String name = "";
private String description = "";
private String event;
private boolean live = false;
}
i List<ActiveAlarm>
przeciw. Jak sortować w kolejności rosnącej według timeStarted
, a następnie według timeEnded
? Czy ktoś może pomóc? Wiem w C ++ z generycznym algorytmem i operatorem przeciążenia <, ale jestem nowy w Javie.
java
sorting
sort-object
Jennifer
źródło
źródło
Odpowiedzi:
Utwórz
ActiveAlarm
implementacjęComparable<ActiveAlarm>
lub zaimplementujComparator<ActiveAlarm>
w oddzielnej klasie. Wtedy zadzwoń:lub
Ogólnie rzecz biorąc, jest to dobry pomysł, aby wdrożyć
Comparable<T>
, jeśli istnieje jeden „naturalny” porządek ... inaczej (jeśli zdarzy się chce uporządkować w określonej kolejności, ale może równie łatwo chcą inną) to lepiej realizowaćComparator<T>
. Szczerze mówiąc, ta konkretna sytuacja może pójść w obie strony ... ale prawdopodobnie trzymałbym się bardziej elastycznejComparator<T>
opcji.EDYCJA: Przykładowa implementacja:
źródło
a = Long.MIN_VALUE, b = 1
..compare
Za pomocą
Comparator
Na przykład:
Od wersji Java 8 możesz po prostu użyć wyrażenia lambda do reprezentowania instancji komparatora.
źródło
compareTo()
? Skąd to pochodzi? Gdzie mam to zdefiniować?getScores()
to metoda pobierająca, dlascores
której jest plikList<Integer>
. KiedygetScores().get(0)
dostanieszInteger
przedmiot.Integer
ma jużcompareTo(anotherInteger)
zaimplementowaną metodę, nie musisz jej definiować.Odpowiedź JAVA 8 i wyżej (przy użyciu wyrażeń lambda)
W Javie 8 wprowadzono wyrażenia Lambda, aby było to jeszcze łatwiejsze! Zamiast tworzyć obiekt Comparator () z całym jego szkieletem, możesz go uprościć w następujący sposób: (Używając swojego obiektu jako przykładu)
lub jeszcze krócej:
To jedno stwierdzenie jest równoważne z następującym:
Pomyśl o wyrażeniach Lambda jako wymagających jedynie umieszczenia odpowiednich części kodu: podpisu metody i tego, co zostanie zwrócone.
Inną częścią twojego pytania było to, jak porównać z wieloma polami. Aby to zrobić z wyrażeniami Lambda, możesz użyć
.thenComparing()
funkcji, aby skutecznie połączyć dwa porównania w jedno:Powyższy kod posortuje listę najpierw według
timeStarted
, a następnie wedługtimeEnded
(dla tych rekordów, które mają to samotimeStarted
).Ostatnia uwaga: łatwo jest porównać prymitywy „długie” lub „int”, wystarczy odjąć jeden od drugiego. Jeśli porównujesz obiekty („Long” lub „String”), sugeruję skorzystanie z ich wbudowanego porównania. Przykład:
EDYCJA: Dziękuję Lukasowi Ederowi za wskazanie mi
.thenComparing()
funkcji.źródło
Comparator.comparing().thenComparing()
...Collections
już dzwonić , możesz zadzwonić bezpośrednio na listę. Na przykład:myList.sort(Comparator.comparing(Address::getZipCode).thenComparing(Compartor.comparing(Address::getStreetName));
Listę możemy posortować na dwa sposoby:
1. Korzystanie z komparatora : Gdy wymagane jest użycie logiki sortowania w wielu miejscach Jeśli chcesz użyć logiki sortowania w jednym miejscu, możesz napisać anonimową klasę wewnętrzną w następujący sposób lub wyodrębnić komparator i użyć go w wielu miejscach
Moglibyśmy sprawdzić właściwości null, gdybyśmy mogli użyć „Long” zamiast „long”.
2. Korzystanie z porównywalnych (porządek naturalny) : Jeśli algorytm sortowania zawsze trzyma się jednej właściwości: napisz klasę, która implementuje „Porównywalny” i zastąp metodę „porównajTo”, jak zdefiniowano poniżej
}
wywołaj metodę sortowania, aby sortować na podstawie naturalnego porządku
źródło
W java8 + można to zapisać w jednej linii w następujący sposób:
collectionObjec.sort(comparator_lamda)
lubcomparator.comparing(CollectionType::getterOfProperty)
kod:
lub
źródło
To powinno dać ci ogólne pojęcie. Gdy to zrobisz, możesz zadzwonić
Collections.sort()
na listę.źródło
Od Java8 można to zrobić jeszcze czystsze przy użyciu kombinacji
Comparator
iLambda expressions
Na przykład:
źródło
Porównanie guawy Łańcuch :
źródło
Możesz używać
Collections.sort
i przekazywać własneComparator<ActiveAlarm>
źródło
W java musisz użyć
Collections.sort
metody statycznej . Oto przykład listy obiektów CompanyRole, posortowanych najpierw według początku, a następnie według końca. Możesz łatwo dostosować się do własnego obiektu.źródło
Możesz wywołać Kolekcje.sort () i przekazać komparator, który musisz napisać, aby porównać różne właściwości obiektu.
źródło
Jak wspomniano, możesz sortować według:
Comparable
Comparator
doCollections.sort
Jeśli zrobisz oba,
Comparable
zostaną zignorowane iComparator
zostaną użyte. Pomaga to w tym, że obiekty wartości mają własną logikę,Comparable
która jest najbardziej rozsądnym sortowaniem dla obiektu wartości, podczas gdy każdy indywidualny przypadek użycia ma swoją własną implementację.źródło