Вопрос-ответ

Sort objects in ArrayList by date?

Сортировать объекты в ArrayList по дате?

Каждый пример, который я нахожу, касается выполнения этого в алфавитном порядке, в то время как мне нужно, чтобы мои элементы были отсортированы по дате.

Мой ArrayList содержит объекты, в которых один из элементов данных является объектом DateTime . В DateTime я могу вызывать функции:

lt() // less-than
lteq() // less-than-or-equal-to

Итак, для сравнения я мог бы сделать что-то вроде:

if(myList.get(i).lt(myList.get(j))){
// ...
}

Что я должен делать внутри блока if?

Переведено автоматически
Ответ 1

Вы можете сделать свой объект сопоставимым:

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);

Однако иногда вам не хочется менять свою модель, например, когда вы хотите выполнить сортировку по нескольким разным свойствам. В этом случае вы можете создать comparator "на лету":

Collections.sort(myList, new Comparator<MyObject>() {
public int compare(MyObject o1, MyObject o2) {
return o1.getDateTime().compareTo(o2.getDateTime());
}
});

Однако вышеописанное работает, только если вы уверены, что DateTime не равно null на момент сравнения. Разумно также обрабатывать null, чтобы избежать исключений NullPointerExceptions:

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());
}
});
Ответ 2

Since Java 8 the List interface provides the sort method. Combined with lambda expression the easiest solution would be

// 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()));

Reverse sorting

Java 8 comes also with some handy methods for reverse sorting.

//requested by lily
list.sort(Comparator.comparing(o -> o.getDateTime()).reversed());
Ответ 3

You can use Collections.sort method. It's a static method. You pass it the list and a comparator. It uses a modified mergesort algorithm over the list. That's why you must pass it a comparator to do the pair comparisons.

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;
}
});

Note that if myList is of a comparable type (one that implements Comparable interface) (like Date, Integer or String) you can omit the comparator and the natural ordering will be used.

Ответ 4
list.sort(Comparator.comparing(o -> o.getDateTime()));

Лучший ответ, ИМХО, от Tunaki, использующий Java 8 lambda

java