一、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 里面用户可以自己实现复杂的可以通用的逻辑,使其可以匹配一些比较简单的对象,那样就可以节省很多重复劳动了