我发现的每个例子都是按字母顺序排列,而我需要按日期对元素进行排序。
我的ArrayList包含对象,其中一个datamember是DateTime对象。 在DateTime上,我可以调用以下函数:
lt() // less-than
lteq() // less-than-or-equal-to
那么,为了进行比较,我可以做这样的事情:
if(myList.get(i).lt(myList.get(j))){
// ...
}
在if块中我应该做什么?
我发现的每个例子都是按字母顺序排列,而我需要按日期对元素进行排序。
我的ArrayList包含对象,其中一个datamember是DateTime对象。 在DateTime上,我可以调用以下函数:
lt() // less-than
lteq() // less-than-or-equal-to
那么,为了进行比较,我可以做这样的事情:
if(myList.get(i).lt(myList.get(j))){
// ...
}
在if块中我应该做什么?
您可以使您的对象可比较:
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,最好也处理null情况:
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());
}
});
// 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()));
反向排序
Java 8还提供了一些方便的方法进行反向排序。
//requested by lily
list.sort(Comparator.comparing(o -> o.getDateTime()).reversed());
list.sort(Comparator.comparing(o -> o.getDateTime()));
。 - Tunakilist.sort(Comparator.comparing(MyObject::getDateTime))
。 - whitebrowlist.sort(Comparator.comparing(MyObject::getDateTime));
将会使最早的日期在第一个位置,最晚的日期在最后一个位置。如果您想要相反的顺序,请按照上面所示进行反转。 - Oliver你可以使用Collections.sort方法。它是一个静态方法。你需要传递给它列表和一个比较器。它使用修改后的归并排序算法对列表进行排序。这就是为什么你必须传递一个比较器来进行比较。
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是可比较类型(实现了Comparable接口的类型),例如Date、Integer或String,您可以省略比较器,使用自然排序。
list.sort(Comparator.comparing(o -> o.getDateTime()));
在我看来,使用Java 8 Lambda的最佳答案是Tunaki提供的。
假设有一个名为MyObject
的对象,其中包含一种叫做getDateTime()
的方法用于获取日期时间。你可以通过以下方式,对包含MyObject
元素的ArrayList
按照DateTime
对象进行排序:
Collections.sort(myList, new Comparator<MyObject>() {
public int compare(MyObject o1, MyObject o2) {
return o1.getDateTime().lt(o2.getDateTime()) ? -1 : 1;
}
});
这是我的解决方法:
Collections.sort(MyList, (o1, o2) -> o1.getLastModified().compareTo(o2.getLastModified()));
这是我实现它的方法:
Mylist.sort(Comparator.comparing(myClass::getStarttime));
未来的读者,我认为这是最简单的解决方案,如果您的模型包含字符串类型的日期(例如"2020-01-01 10:00:00"),那么只需编写以下代码即可按照日期降序排列数据,从最新到最旧:
Collections.sort(messages, (o1, o2) -> o2.getMessageDate().compareTo(o1.getMessageDate()));
随着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));
我发现这里所有的答案对于一个简单的问题来说都过于复杂了(至少是对于一个有经验的Java开发者来说,而我不是)。我曾经遇到过类似的问题,并偶然发现了这个(和其他)解决方案,但对于一个初学者来说,它们提供的指示并不够清晰。我的解决方案取决于你的日期在对象中的位置,而在这种情况下,日期是Object[]中第一个元素,其中dataVector是包含你的对象的ArrayList。
Collections.sort(dataVector, new Comparator<Object[]>() {
public int compare(Object[] o1, Object[] o2) {
return ((Date)o1[0]).compareTo(((Date)o2[0]));
}
});
DateTime
对象的描述。如果只有 Date
或 DateTime
对象是可比较的,那么一开始就不需要使用 Comparator
。 - amotzg