有人可以帮我弄这个吗?我找到的每个例子都是按字母顺序执行此操作,而我需要按日期排序元素.
我的ArrayList包含其中一个数据库是DateTime对象的对象.在DateTime上我可以调用这些函数:
lt() // less-than
lteq() // less-than-or-equal-to
Run Code Online (Sandbox Code Playgroud)
所以要比较我可以这样做:
if(myList.get(i).lt(myList.get(j))){
// ...
}
Run Code Online (Sandbox Code Playgroud)
我真的不知道在if块内做什么.有任何想法吗?
Dom*_*chi 392
您可以使您的对象具有可比性:
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());
}
}
Run Code Online (Sandbox Code Playgroud)
然后你通过调用它来排序:
Collections.sort(myList);
Run Code Online (Sandbox Code Playgroud)
但是,有时您不希望更改模型,例如当您想要对几个不同的属性进行排序时.在这种情况下,您可以动态创建比较器:
Collections.sort(myList, new Comparator<MyObject>() {
public int compare(MyObject o1, MyObject o2) {
return o1.getDateTime().compareTo(o2.getDateTime());
}
});
Run Code Online (Sandbox Code Playgroud)
但是,只有在比较时确定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());
}
}
Run Code Online (Sandbox Code Playgroud)
或者在第二个例子中:
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());
}
});
Run Code Online (Sandbox Code Playgroud)
Pau*_*ski 53
从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()))
Run Code Online (Sandbox Code Playgroud)
hel*_*ios 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;
}
});
Run Code Online (Sandbox Code Playgroud)
请注意,如果myList属于可比类型(实现Comparable接口的类型)(如Date,Integer或String),则可以省略比较器并使用自然顺序.
list.sort(Comparator.comparing(o -> o.getDateTime()));
Run Code Online (Sandbox Code Playgroud)
来自Tunaki使用Java 8 lambda的最佳答案IMHO
假设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;
}
});
Run Code Online (Sandbox Code Playgroud)
我是这样解决的:
Collections.sort(MyList, (o1, o2) -> o1.getLastModified().compareTo(o2.getLastModified()));
Run Code Online (Sandbox Code Playgroud)
希望对你有帮助。
小智 6
这是我如何实现它的答案:
Mylist.sort(Comparator.comparing(myClass::getStarttime));
Run Code Online (Sandbox Code Playgroud)