Сортировать объекты в ArrayList по дате?
может кто-нибудь помочь мне с этим? Каждый пример, который я нахожу, - это делать это в алфавитном порядке, в то время как мне нужны мои элементы, отсортированные по дате.
мой ArrayList содержит объекты, на которых один из datamembers является объектом DateTime. В DateTime я могу вызвать функции:
lt() // less-than
lteq() // less-than-or-equal-to
поэтому для сравнения я мог бы сделать что-то вроде:
if(myList.get(i).lt(myList.get(j))){
// ...
}
Я не знаю, что делать внутри блока if. Есть идеи?
11 ответов
вы можете сделать ваш объект сопоставимым:
public static class MyObject implements Comparable<MyObject> {
private Date dateTime;
public Date getDateTime() {
return dateTime;
}
public void setDateTime(Date datetime) {
this.dateTime = datetime;
}
@Override
public int compareTo(MyObject o) {
return getDateTime().compareTo(o.getDateTime());
}
}
и затем вы сортируете его по телефону:
Collections.sort(myList);
однако иногда вы не хотите менять свою модель, например, когда вы хотите сортировать по нескольким различным свойствам. В этом случае, вы можете создать компаратор на лету:
Collections.sort(myList, new Comparator<MyObject>() {
public int compare(MyObject o1, MyObject o2) {
return o1.getDateTime().compareTo(o2.getDateTime());
}
});
однако вышеизложенное работает только в том случае, если вы уверены, что dateTime не является нулевым во время сравнения. Разумно также обрабатывать null, чтобы избежать Возникновению исключительных ситуаций типа NullPointerException:
public static class MyObject implements Comparable<MyObject> {
private Date dateTime;
public Date getDateTime() {
return dateTime;
}
public void setDateTime(Date datetime) {
this.dateTime = datetime;
}
@Override
public int compareTo(MyObject o) {
if (getDateTime() == null || o.getDateTime() == null)
return 0;
return getDateTime().compareTo(o.getDateTime());
}
}
или во втором примере:
Collections.sort(myList, new Comparator<MyObject>() {
public int compare(MyObject o1, MyObject o2) {
if (o1.getDateTime() == null || o2.getDateTime() == null)
return 0;
return o1.getDateTime().compareTo(o2.getDateTime());
}
});
начиная с Java 8 список интерфейс обеспечивает вроде метод. В сочетании с лямда - выражение самым простым решением будет
// sort DateTime typed list
list.sort((d1,d2) -> d1.compareTo(d2));
// or an object which has an DateTime attribute
list.sort((o1,o2) -> o1.getDateTime().compareTo(o2.getDateTime()));
// or like mentioned by Tunaki
list.sort(Comparator.comparing(o -> o.getDateTime()))
вы можете использовать коллекции.метод сортировки. Это статический метод. Вы передаете ему список и компаратор. Он использует модифицированный алгоритм mergesort над списком. Вот почему вы должны передать ему компаратор для выполнения парных сравнений.
Collections.sort(myList, new Comparator<MyObject> {
public int compare(MyObject o1, MyObject o2) {
DateTime a = o1.getDateTime();
DateTime b = o2.getDateTime();
if (a.lt(b))
return -1;
else if (a.lteq(b)) // it's equals
return 0;
else
return 1;
}
});
обратите внимание, что если myList имеет сопоставимый тип (тот, который реализует сопоставимый интерфейс) (например, дата, целое число или строка), вы можете опустить компаратор, и будет использоваться естественный порядок.
дано MyObject
что есть DateTime
членов getDateTime()
метод, вы можете сортировать ArrayList
, содержащую MyObject
элементов DateTime
объекты вроде этого:
Collections.sort(myList, new Comparator<MyObject>() {
public int compare(MyObject o1, MyObject o2) {
return o1.getDateTime().lt(o2.getDateTime()) ? -1 : 1;
}
});
list.sort(Comparator.comparing(o -> o.getDateTime()));
лучший ответ IMHO от Tunaki с использованием Java 8 lambda
вот как я решил:
Collections.sort(MyList, (o1, o2) -> o1.getLastModified().compareTo(o2.getLastModified()));
надеюсь это поможет вам.
все ответы здесь я нашел не обязательно сложными для простой проблемы (по крайней мере, для опытного разработчика java, которым я не являюсь). У меня была аналогичная проблема, и я случайно нашел это (и другие) решения, и хотя они предоставили указатель, для новичка я нашел, как указано выше. Мое решение зависит от того, где в объекте находится ваша дата, в этом случае дата является первым элементом объекта[] где dataVector ArrayList содержит ваш Объекты.
Collections.sort(dataVector, new Comparator<Object[]>() {
public int compare(Object[] o1, Object[] o2) {
return ((Date)o1[0]).compareTo(((Date)o2[0]));
}
});
С введением в Java 1.8, потоки очень полезны в решении такого рода проблем:
Comparator <DateTime> myComparator = (arg1, arg2)
-> {
if(arg1.lt(arg2))
return -1;
else if (arg1.lteq(arg2))
return 0;
else
return 1;
};
ArrayList<DateTime> sortedList = myList
.stream()
.sorted(myComparator)
.collect(Collectors.toCollection(ArrayList::new));
это может быть старый ответ, но я использовал некоторые примеры из этого поста, чтобы создать компаратор, который будет сортировать ArrayList
of HashMap<String, String>
одним объектом в списке, который является меткой времени.
у меня есть эти объекты:
ArrayList<Map<String, String>> alList = new ArrayList<Map<String, String>>();
объекты карты следующие:
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");
это сопоставление-это то, что я использую для загрузки всех моих объектов в список массивов, используя
передайте ArrayList в аргументе.
private static void order(ArrayList<Object> list) {
Collections.sort(list, new Comparator() {
public int compare(Object o2, Object o1) {
String x1 = o1.Date;
String x2 = o2.Date;
return x1.compareTo(x2);
}
});
}