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
lub HashMap<String, String>
według jednego obiektu na liście, czyli znacznika czasu.
Mam te obiekty:
ArrayList<Map<String, String>> alList = new ArrayList<Map<String, String>>();
Obiekty mapy są następujące:
Map<String, Object> map = new HashMap<>();
// of course this is the actual formatted date below in the timestamp
map.put("timestamp", "MM/dd/yyyy HH:mm:ss");
map.put("item1", "my text goes here");
map.put("item2", "my text goes here");
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:
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
public class DateSorter implements Comparator {
public int compare(Object firstObjToCompare, Object secondObjToCompare) {
String firstDateString = ((HashMap<String, String>) firstObjToCompare).get("timestamp");
String secondDateString = ((HashMap<String, String>) secondObjToCompare).get("timestamp");
if (secondDateString == null || firstDateString == null) {
return 0;
}
// Convert to Dates
DateTimeFormatter dtf = DateTimeFormat.forPattern("MM/dd/yyyy HH:mm:ss");
DateTime firstDate = dtf.parseDateTime(firstDateString);
DateTime secondDate = dtf.parseDateTime(secondDateString);
if (firstDate.isAfter(secondDate)) return -1;
else if (firstDate.isBefore(secondDate)) return 1;
else return 0;
}
}
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.
Collections.sort(alList, new DateSorter());
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 =]