1、比较comparable和comparator,选择正确的方法进行排序
Comparable:强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的compareTo方法被称为它的自然比较方法。只能在类中实现compareTo()一次,不能经常修改类的代码实现自己想要的排序。实现此接口的对象列表(和数组)可以通过Collections.sort(和Arrays.sort)进行自动排序,对象可以用作有序映射中的键或有序集合中的元素,无需指定比较器。
Comparator强行对某个对象进行整体排序。可以将Comparator 传递给sort方法(如Collections.sort或 Arrays.sort),从而允许在排序顺序上实现精确控制。还可以使用Comparator来控制某些数据结构(如有序set或有序映射)的顺序,或者为那些没有自然顺序的对象collection提供排序。
因此,要想对对象中的内容按照一定的顺序进行整体排序,应选择comparator比较器。
2、以学生管理为例,要求按照成绩的升序进行排序。
在写好基本学生类和管理类的基础上进行添加修改。
首先应该在学生类中实现Comparator比较类,并重写ComparaTo方法,若按升序排序,结构如下:
public class Student implements Comparable<Student>{
....
@Override
public int compareTo(Student o) {
return this.grade-o.grade;//升序
}
}
然后,在测试类方法中,使用collections.sort()或arrays.sort()方法即可进行排序,具体如下:
/*
让学生 按照年龄排序 升序
*/
Collections.sort(list);//要求 该list中元素类型 必须实现比较器Comparable接口
list是用来储存学生信息的。经证明此方法可行。
3、自定义Comparator规则
如果在使用的时候,想要独立的定义规则去使用,可以采用Collections.sort(List list,Comparetor<T> c)方式,自己定义规则,具体如下:
Collections.sort(list, new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
return o2.getAge()-o1.getAge();//以学生的年龄降序
}
});
结果如下:
Student{name='rose', age=18}
Student{name='ace', age=17}
Student{name='jack', age=16}
Student{name='abc', age=16}
Student{name='mark', age=16}
经测试,此方法也是可行的。