Każdy przykład, który znajduję, dotyczy robienia tego alfabetycznie, podczas gdy ja potrzebuję moich elementów posortowanych według daty.
My ArrayList zawiera obiekty, w których jeden z elementów datambers jest obiektem DateTime. W DateTime mogę wywołać funkcje:
lt() // less-than
lteq() // less-than-or-equal-to
Więc dla porównania mógłbym zrobić coś takiego:
if(myList.get(i).lt(myList.get(j))){
// ...
}
Co powinienem zrobić wewnątrz bloku if?
Odpowiedzi:
Możesz porównać swój obiekt:
A potem sortuj to, dzwoniąc:
Czasami jednak nie chcesz zmieniać modelu, na przykład gdy chcesz posortować według kilku różnych właściwości. W takim przypadku możesz utworzyć komparator w locie:
Jednak powyższe działa tylko wtedy, gdy masz pewność, że dateTime nie jest null w momencie porównania. Dobrze jest również obsłużyć wartość null, aby uniknąć wyjątków NullPointerExceptions:
Lub w drugim przykładzie:
źródło
Od wersji Java 8 interfejs List udostępnia metodę sortowania . W połączeniu z wyrażeniem lambda najłatwiejszym rozwiązaniem byłoby
Odwrotne sortowanie
Java 8 zawiera również przydatne metody sortowania wstecznego.
źródło
list.sort(Comparator.comparing(o -> o.getDateTime()));
list.sort(Comparator.comparing(MyObject::getDateTime)
Możesz użyć metody Collections.sort. To metoda statyczna. Przekazujesz mu listę i komparator. Używa zmodyfikowanego algorytmu scalania na liście. Dlatego musisz przekazać mu komparator, aby dokonać porównań par.
Zauważ, że jeśli myList jest porównywalnego typu (takiego, który implementuje interfejs Comparable) (jak Date, Integer lub String), możesz pominąć komparator i zostanie użyte naturalne uporządkowanie.
źródło
Najlepsza odpowiedź IMHO od Tunaki przy użyciu Java 8 lambda
źródło
Biorąc pod uwagę,
MyObject
że ma elementDateTime
członkowski zgetDateTime()
metodą, możesz posortować plikArrayList
zawierającyMyObject
elementy wedługDateTime
obiektów takich jak ten:źródło
Oto jak rozwiązałem:
Mam nadzieję, że ci to pomoże.
źródło
Wraz z wprowadzeniem Javy 1.8, strumienie są bardzo przydatne w rozwiązywaniu tego rodzaju problemów:
źródło
Wszystkie odpowiedzi tutaj okazały się niekoniecznie złożone w przypadku prostego problemu (przynajmniej dla doświadczonego programisty Java, którym nie jestem). Miałem podobny problem i trafiłem na to (i inne) rozwiązania i chociaż zapewniły one wskazówkę, dla początkującego znalazłem, jak wspomniano powyżej. Moje rozwiązanie zależy od tego, gdzie w obiekcie znajduje się Twoja data, w tym przypadku data jest pierwszym elementem obiektu [], gdzie dataVector to ArrayList zawierająca Twoje obiekty.
źródło
DateTime
obiektu, który znajduje się wewnątrz innego obiektu, przez OP . Gdyby to było tylkoDate
lubDateTime
przedmioty, które są, to wComparable
ogóle nie było potrzebyComparator
.Może to być stara odpowiedź, ale użyłem kilku przykładów z tego postu, aby utworzyć komparator, który posortowałby wartość
ArrayList
lubHashMap<String, String>
według jednego obiektu na liście, czyli znacznika czasu.Mam te obiekty:
Obiekty mapy są następujące:
To mapowanie jest tym, czego używam, aby załadować wszystkie moje obiekty do listy tablic, używając
alList.add(map)
funkcji, w pętli.Teraz stworzyłem własny komparator:
Mogę teraz po prostu zadzwonić do Komparatora w dowolnym momencie w tablicy i posortuje moją tablicę, podając mi najnowszą sygnaturę czasową na pozycji 0 (u góry listy) i najwcześniejszy znacznik czasu na końcu listy. Zasadniczo nowe posty trafiają na szczyt.
Może to komuś pomóc, dlatego to opublikowałem. Weź pod uwagę instrukcje powrotu w funkcji compare (). Istnieją 3 rodzaje wyników. Zwracanie 0, jeśli są równe, zwracanie> 0, jeśli pierwsza data jest przed drugą datą i <0, jeśli pierwsza data jest późniejsza niż druga. Jeśli chcesz, aby Twoja lista została odwrócona, po prostu zamień te dwie instrukcje powrotu! Simple =]
źródło
Przekaż argument ArrayList In.
źródło
Skorzystaj z poniższego podejścia, aby określić, czy daty są sortowane, czy nie
źródło
SimpleDateFormat
klasy. Przynajmniej nie jako pierwsza opcja. I nie bez zastrzeżeń. Dziś mamy o wiele lepszejava.time
, nowoczesne API daty i czasu Java i jegoDateTimeFormatter
.Klasa Date implementuje już interfejs Comparator. Zakładając, że masz klasę poniżej:
Powiedzmy, że masz listę obiektów A, ponieważ
List<A> aList
możesz ją łatwo posortować za pomocą strumieniowego API Java 8 (fragment poniżej):źródło
Przyszli widzowie, myślę, że jest to najprostsze rozwiązanie, jeśli twój model zawiera datę typu string (na przykład „2020-01-01 10:00:00”), po prostu napisz następujący wiersz, aby posortować dane według daty malejącej od od najnowszych do najstarszych:
źródło