我阅读了关于使用 Comparator 对 ArrayList 进行排序的文章,但在所有示例中,人们都使用了 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
,它有一个 compareTo
方法,就像 String
一样。
所以你的自定义 Comparator
可能看起来像这样:
public class CustomComparator implements Comparator<MyObject> {
@Override
public int compare(MyObject o1, MyObject o2) {
return o1.getStartDate().compareTo(o2.getStartDate());
}
}
compare()
方法必须返回一个 int
,因此您不能像您计划的那样直接返回一个 boolean
。
你的排序代码和你写的差不多:
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));
所有这些都是等价的形式。
关于java - 按属性对自定义对象的 ArrayList 进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2784514/