我阅读了有关使用 Comparator 对 ArrayLists 进行排序的信息,但在人们使用的所有示例中compareTo,根据一些研究,这是一种字符串方法。
compareTo
我想按其属性之一对自定义对象的 ArrayList 进行排序:日期对象 ( getStartDay())。通常我会比较它们,item1.getStartDate().before(item2.getStartDate())所以我想知道我是否可以写一些类似的东西:
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); ... }
由于Dateimplements Comparable,它有一个compareTo方法,就像Stringdoes 一样。
Date
Comparable
String
因此,您的自定义Comparator可能如下所示:
Comparator
public class CustomComparator implements Comparator<MyObject> { @Override public int compare(MyObject o1, MyObject o2) { return o1.getStartDate().compareTo(o2.getStartDate()); } }
该compare()方法必须返回 a ,因此无论如何您都不能像您计划的那样int直接返回 a 。boolean
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()); } });
您现在可以使用lambda 表达式以更短的形式编写最后一个示例Comparator:
Collections.sort(Database.arrayList, (o1, o2) -> o1.getStartDate().compareTo(o2.getStartDate()));
并且List有一个sort(Comparator)方法,所以你可以进一步缩短它:
List
sort(Comparator)
Database.arrayList.sort((o1, o2) -> o1.getStartDate().compareTo(o2.getStartDate()));
这是一个常见的习惯用法,有一个内置方法Comparator可以为具有键的类生成一个Comparable:
Database.arrayList.sort(Comparator.comparing(MyObject::getStartDate));
所有这些都是等价的形式。