一、Comparable:
Comparable:接口,位于 java.lang包下,实现了这个接口,就让这个类具备了可比较(排序)的能力
如果我想对一个Person类型的集合进行排序,应该怎么办?让Person类实现Comparable接口
使用步骤:
1. 让类实现Comparable接口
2. 重写里面的方法: compareTo
升序:用this和参数作比较
降序:用参数和this做比较
3. 调用Collections.sort()方法进行排序
Comparable中方法的重写案例:
@
Override
public int compareTo(Person o) {
//如果用当前对象和参数的对象比较得到的就是升序
//如果用参数的对象和当前的对象比较得到的就是降序
//return this.age - o.age; //这样为升序
//return o.age - this.age; //这样为降序
return
this
.name.compareTo(o.name);//注意:此处的compareTo方法是字符串中的方法,name为一个字符串类型,直接调用的字符串的字符串重写的compareTo方法
}
二、Comparator:
Comparator: 位于java.util包下, 也是用来排序的,对于那些不想实现Comparable接口的类,或者对于里边的实现方式不满意,我们就
可以使用Comparator接口重新定义排序规则
Collections.sort(List<T>t,Comparator c);
使用步骤:
1. 写一个比较器,实现Comparator接口:子类
2. 重写里边的compare方法,定义自己的排序规则
3. 调用Collections.sort(list,子类的对象);
还可以直接使用匿名内部类的方式
调用Comparator接口(此处为匿名内部类的使用)案例:
下面程序实现的是对自定义类的一个排序,先根据年龄进行升序,年龄相同,按照分数降序排列
Collections.sort(list2, new Comparator<Student>() {
//重写的compare方法中,前面参数和后面参数作比较,得到的是升序;后面参数和前面参数作比较,得到的是降序
@Override
public int compare(Student o1, Student o2) {
if(o1.getAge() == o2.getAge()){
return o2.getScore()>o1.getScore()?1:-1;
}
return o1.getAge() - o2.getAge();
}
});
三、Comparable和Comparator的区别:
Comparable: 内部的比较器,位于java.lang包下,如果一个类想要使用Collection.sort(list)方法进行排序,
则该类需要实现Comparable接口来支持排序
Comparator: 外部比较器,位于java.util包下,如果对于Comparable中的排序规则不满意,或者不想实现Comparable接口的
类,可以使用Comparator进行排序。 Colections.sort(list,Comparator c);
无需改变类的结构
注:如果在一个自定类中两个都有,最后执行的结果是以Compartor为准