我读到了使用比较器对ArrayLists进行排序,但在所有示例中,人们使用compareTo,根据一些研究,这是一个字符串的方法.
我想通过它们的一个属性对自定义对象的ArrayList进行排序:Date对象
(getStartDay()).通常我会通过item1.getStartDate().before(item2.getStartDate())来比较它们,所以我想知道我是否可以这样写:
public class CustomComparator {
public boolean compare(Object object1, Object object2) {
return object1.getStartDate().before(object2.getStartDate());
}
}
public class RandomName {
...
Collections.sort(Database.arrayList, new CustomComparator);
...
}
解决方法:
自Date
实现Comparable
以来,它就像String一样有一个compareTo方法.
所以你的自定义Comparator
可能如下所示:
public class CustomComparator implements Comparator<MyObject> {
@Override
public int compare(MyObject o1, MyObject o2) {
return o1.getStartDate().compareTo(o2.getStartDate());
}
}
compare()方法必须返回一个int,因此无法直接返回一个类似于计划的布尔值.
你的排序代码就像你写的那样:
Collections.sort(Database.arrayList, new CustomComparator());
如果你不需要重用你的比较器,写一个稍微短一点的方法是将它写成内联匿名类:
Collections.sort(Database.arrayList, new Comparator<MyObject>() {
@Override
public int compare(MyObject o1, MyObject o2) {
return o1.getStartDate().compareTo(o2.getStartDate());
}
});
自java-8年起
您现在可以使用lambda expression为比较器以较短的形式编写最后一个示例:
Collections.sort(Database.arrayList,
(o1, o2) -> o1.getStartDate().compareTo(o2.getStartDate()));
List有一个sort(Comparator)
方法,所以你可以进一步缩短它:
Database.arrayList.sort((o1, o2) -> o1.getStartDate().compareTo(o2.getStartDate()));
这是一个常见的习惯用法,即a built-in method为具有Comparable键的类生成Comparator:
Database.arrayList.sort(Comparator.comparing(MyObject::getStartDate));
所有这些都是等效的形式.