5 回答
TA贡献1818条经验 获得超3个赞
自从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表达式以更短的形式编写最后一个示例Comparator
:
Collections.sort(Database.arrayList, (o1, o2) -> o1.getStartDate().compareTo(o2.getStartDate()));
并且List
有一个sort(Comparator)
方法,所以你可以进一步缩短它:
Database.arrayList.sort((o1, o2) -> o1.getStartDate().compareTo(o2.getStartDate()));
这是一个常见的习惯用法,有一个内置的方法来生成一个Comparator
带有Comparable
键的类:
Database.arrayList.sort(Comparator.comparing(MyObject::getStartDate));
所有这些都是等效的形式。
TA贡献1797条经验 获得超6个赞
对于排序,ArrayList您可以使用以下代码段:
Collections.sort(studList, new Comparator<Student>(){
public int compare(Student s1, Student s2) {
return s1.getFirstName().compareToIgnoreCase(s2.getFirstName());
}
});
TA贡献1810条经验 获得超5个赞
是的你可以。比较项目有两个选项:Comparable接口和Comparator接口。
这两种接口都允许不同的行为。Comparable允许您使对象的行为与您刚刚描述的Strings一样(事实上,String实现了Comparable)。第二个,比较器,允许你做你想要做的事情。你会这样做:
Collections.sort(myArrayList, new MyComparator());
这将导致Collections.sort方法将比较器用于它的排序机制。如果ArrayList中的对象具有可比性,则可以执行以下操作:
Collections.sort(myArrayList);
该集合类包含了一些这些有用的,常用工具。
TA贡献2003条经验 获得超2个赞
JAVA 8 lambda表达式
Collections.sort(studList, (Student s1, Student s2) ->{
return s1.getFirstName().compareToIgnoreCase(s2.getFirstName());
});
要么
Comparator<Student> c = (s1, s2) -> s1.firstName.compareTo(s2.firstName);
studList.sort(c)
添加回答
举报