Comparable接口
让类实现Comparable接口,同时重写compareTo方法。Arrays的sort方法底层会根据compareTo方法的返回值是正数、负数、还是0来确定谁大、谁小、谁相等。
public class Student implements Comparable<Student>{
private String name;
private double height;
private int age;
//...get、set、空参数构造方法、有参数构造方法...自己补全
// 指定比较规则
// this o
@Override
public int compareTo(Student o) {
// 约定1:认为左边对象 大于 右边对象 返回正整数
// 约定2:认为左边对象 小于 右边对象 返回负整数
// 约定3:认为左边对象 等于 右边对象 返回0
if(this.age > o.age){
return 1;
}else if(this.age < o.age){
return -1;
}
return 0;
//上面的if语句,也可以简化为下面的一行代码
return this.age - o.age; // 按照年龄升序排列
return o.age - this.age; // 按照年龄降序排列
}
Comparator比较器
在调用Arrays.sort(数组,Comparator比较器);时,除了传递数组之外,传递一个Comparator比较器对象。Arrays的sort方法底层会根据Comparator比较器对象的compare方法方法的返回值是正数、负数、还是0来确定谁大、谁小、谁相等。
public class ArraysTest2 {
public static void main(String[] args) {
Student[] students = new Student[4];
students[0] = new Student("蜘蛛精", 169.5, 23);
students[1] = new Student("紫霞", 163.8, 26);
students[2] = new Student("紫霞", 163.8, 26);
students[3] = new Student("至尊宝", 167.5, 24);
// 2、public static <T> void sort(T[] arr, Comparator<? super T> c)
// 参数一:需要排序的数组
// 参数二:Comparator比较器对象(用来制定对象的比较规则)
Arrays.sort(students, new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
// 制定比较规则了:左边对象 o1 右边对象 o2
// 约定1:认为左边对象 大于 右边对象 返回正整数
// 约定2:认为左边对象 小于 右边对象 返回负整数
// 约定3:认为左边对象 等于 右边对象 返回0
if(o1.getHeight() > o2.getHeight()){
return 1;
}else if(o1.getHeight() < o2.getHeight()){
return -1;
}
return 0; // 升序
//上面的if语句,也可以简化为下面的一行代码
return Double.compare(o1.getHeight(), o2.getHeight()); // 升序
return Double.compare(o2.getHeight(), o1.getHeight()); // 降序
}
});
System.out.println(Arrays.toString(students));
}
}