Comparable与Comparator有什么区别?
原创
©著作权归作者所有:来自51CTO博客作者Coding路人王的原创作品,请联系作者获取转载授权,否则将追究法律责任
一、Comparable接口
Comparable是排序接口。若一个类实现了Comparable接口,就意味着该类支持排序。实现了Comparable接口的类的对象的列表或数组可以通过Collections.sort或Arrays.sort进行自动排序。
实现此接口的对象可以用作有序映射中的键或有序集合中的集合,无需指定比较器
需求:请将两个对象之间的属性字段按照大小规则排序
如: * 1.如何按照年龄大小排序呢?
* 2.体重降序排列呢??
* 3.按照年龄升序排列,年龄相同的体重升序排列???
代码:
public class Student implements Comparable<Student>{
private int age;
private String name;
private int weight;
...
/**
* 实现Comparable接口 重写compareTo方法即可
* return表示的是 0 相同 0 1【正序】 -1【倒叙】
* 优点:灵活
* 缺点:每次指定规则
*
* 1.如何按照年龄大小排序呢?
* return (this.age < o.age) ? -1 : ((this.age == o.age) ? 0 : 1);
* 2.体重降序排列呢??
* return -(this.weight < o.weight) ? -1 : ((this.weight == o.weight) ? 0 : 1);
* 3.按照年龄升序排列,年龄相同的体重升序排列???
* if (this.age == o.age){
* return ((this.weight < o.weight) ? -1 : ((this.weight == o.weight) ? 0 : 1));
* }else{
* return (this.age < o.age) ? -1 : 1;
* }
*/
@Override
public int compareTo(Student o) {
// return 0;
//return (this.age < o.age) ? -1 : ((this.age == o.age) ? 0 : 1);
if (this.age == o.age){
return ((this.weight < o.weight) ? -1 : ((this.weight == o.weight) ? 0 : 1));
}else{
return (this.age < o.age) ? -1 : 1;
}
}
}
测试方法:
public class Comparable01 {
public static void main(String[] args) {
List<Student> list = new ArrayList<>();
list.add(new Student(13,"张三",100));
list.add(new Student(16,"李四",120));
list.add(new Student(11,"王五",130));
// Comparable: Collections.sort(list); 会报错 按照神魔来排序呢????
System.out.println(list);
Collections.sort(list);
System.out.println(list);
}
}
二、Comparator接口【比较器】
若一个类要实现Comparator接口:它一定要实现compare(T o1, T o2) 函数
public class Person {
private int age;
private String name;
private int weight;
}
实现比较器的方法:
class PersonCompare implements Comparator<Person>{
// 指定比较规则,和Comparable 的写法是一样的
@Override
public int compare(Person o1, Person o2) {
// return 0;
// 按照年龄升序排序
return o1.getAge() - o2.getAge();
}
}
测试方法:
public class Comparator01 {
public static void main(String[] args) {
List<Person> list = new ArrayList<>();
list.add(new Person(13,"张三",100));
list.add(new Person(16,"李四",120));
list.add(new Person(11,"王五",130));
// 创建一个比较的实现类,放入比较规则
Comparator c = new PersonCompare();
Collections.sort(list, c);
}
}
三、总结
1.Comparable是排序接口,若一个类实现了Comparable接口,就意味着“该类支持排序”。
2.Comparator是比较器,我们若需要控制某个类的次序,可以建立一个“该类的比较器”来进行排序。
3.Comparable相当于“内部比较器”,而Comparator相当于“外部比较器”。
4.用Comparable 简单, 只要实现Comparable 接口的对象直接就成为一个可以比较的对象,但是需要修改源代码。
5.用Comparator 的好处是不需要修改源代码, 而是另外实现一个比较器, 当某个自定义的对象需要作比较的时候,把比较器和对象一起传递过去就可以比大小了, 并且在Comparator 里面用户可以自己实现复杂的可以通用的逻辑,使其可以匹配一些比较简单的对象,那样就可以节省很多重复劳动了