问题
有人可以帮我弄这个吗?我发现的每个例子都是按字母顺序执行此操作,而我需要按日期排序元素。
我的ArrayList包含其中一个datamembers是DateTime对象的对象。在DateTime上我可以调用函数:
lt() // less-than
lteq() // less-than-or-equal-to
所以要比较我可以做类似的事情:
if(myList.get(i).lt(myList.get(j))){
// ...
}
我真的不知道在if块内做什么。有任何想法吗?
#1 热门回答(334 赞)
你可以使你的对象具有可比性:
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时,上述方法才有效。处理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 热门回答(31 赞)
自Java 8以来,List接口提供了sort方法。结合lambda表达式,最简单的解决方案就是
// 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()))
#3 热门回答(18 赞)
你可以使用Collections.sort方法。这是一种静态方法。你传递它的列表和比较器。它在列表上使用修改后的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属于可比类型(实现Comparable接口的类型)(如Date,Integer或String),则可以省略比较器并使用自然顺序。