我读到了使用比较器对 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
,因此无法直接返回一个类似于计划的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());
}
});
您现在可以通过使用Comparator
的lambda 表达式以较短的形式编写最后一个示例:
Collections.sort(Database.arrayList,
(o1, o2) -> o1.getStartDate().compareTo(o2.getStartDate()));
List
有一个sort(Comparator)
方法,所以你可以进一步缩短它:
Database.arrayList.sort((o1, o2) -> o1.getStartDate().compareTo(o2.getStartDate()));
这是一个常见的习惯用法,它有一个内置的方法来为具有Comparable
键的类生成Comparator
:
Database.arrayList.sort(Comparator.comparing(MyObject::getStartDate));
所有这些都是等效的形式。
具有自然排序顺序的类(作为示例的类 Number)应该实现 Comparable 接口,而没有自然排序顺序的类(作为示例的类)应该与比较器(或匿名比较器)一起提供类)。
两个例子:
public class Number implements Comparable<Number> {
private int value;
public Number(int value) { this.value = value; }
public int compareTo(Number anotherInstance) {
return this.value - anotherInstance.value;
}
}
public class Chair {
private int weight;
private int height;
public Chair(int weight, int height) {
this.weight = weight;
this.height = height;
}
/* Omitting getters and setters */
}
class ChairWeightComparator implements Comparator<Chair> {
public int compare(Chair chair1, Chair chair2) {
return chair1.getWeight() - chair2.getWeight();
}
}
class ChairHeightComparator implements Comparator<Chair> {
public int compare(Chair chair1, Chair chair2) {
return chair1.getHeight() - chair2.getHeight();
}
}
用法:
List<Number> numbers = new ArrayList<Number>();
...
Collections.sort(numbers);
List<Chair> chairs = new ArrayList<Chair>();
// Sort by weight:
Collections.sort(chairs, new ChairWeightComparator());
// Sort by height:
Collections.sort(chairs, new ChairHeightComparator());
// You can also create anonymous comparators;
// Sort by color:
Collections.sort(chairs, new Comparator<Chair>() {
public int compare(Chair chair1, Chair chair2) {
...
}
});
要对ArrayList
进行排序,您可以使用以下代码段:
Collections.sort(studList, new Comparator<Student>(){
public int compare(Student s1, Student s2) {
return s1.getFirstName().compareToIgnoreCase(s2.getFirstName());
}
});