比较器-Comparable和Comparator

打印 上一主题 下一主题

主题 881|帖子 881|积分 2643

Comparable是排序接口;若一个类实现了Comparable接口,就意味着“该类支持排序”。可以使用Arrays.sort()对改类进行排序
1.Comparable接口

使用场景:假如说我们有这样一个需求,需要设计一个Person类,有两个属性:姓名(name)、年龄(age),按照年龄的大小进行排序,那么实现可以这样
注意:
  1. public class Person implements Comparable<Person>{
  2.     private String name;
  3.     private int age;
  4.     public Person(String name, int age) {
  5.         this.name = name;
  6.         this.age = age;
  7.     }
  8.     @Override
  9.     public String toString() {
  10.         return "Person{" +
  11.                 "name='" + name + '\'' +
  12.                 ", age=" + age +
  13.                 '}';
  14.     }
  15.     @Override
  16.     public int compareTo(Person o) {
  17.         if (this.age > o.age) {
  18.             return 1;
  19.         } else {
  20.             return -1;
  21.         }
  22. //        return Integer.compare(this.age, o.age);
  23.     }
  24. }
  25. public static void main(String[] args) {
  26.     Person[] people = new Person[]{
  27.             new Person("张三",25),
  28.             new Person("李四",17),
  29.             new Person("王五",35),
  30.     };
  31.     Arrays.sort(people);
  32.     System.out.println(Arrays.toString(people));
  33. }
复制代码
Comparable接口内里有一个泛型T,T的选择为可以与之比较的对象的类型,一般就是实现该接口类的本身,可以这样想和Person类比较的当然是Person本身了。
2.Comparator接口

Comparator也是一个比较器,但是属于挽救设计的一种,一般来说尽量减少。
使用场景:假如说我们有这样一个需求,需要对Person类的年龄进行排序,但是Person类是别人写好的,内里没有Comparable接口,如果在不允许改变源代码的情况下,我们可以使用Comparator接口。
  1. public class Person {
  2.     private String name;
  3.     private int age;
  4.     public Person(String name, int age) {
  5.         this.name = name;
  6.         this.age = age;
  7.     }
  8.     @Override
  9.     public String toString() {
  10.         return "Person{" +
  11.                 "name='" + name + '\'' +
  12.                 ", age=" + age +
  13.                 '}';
  14.     }
  15. }
  16. public class PersonComparator implements Comparator<Person> {
  17.     @Override
  18.     public int compare(Person o1, Person o2) {
  19.         return Integer.compare(o1.getAge(), o1.getAge());
  20.     }
  21. }
  22. public static void main(String[] args) {
  23.     Person[] people = new Person[]{
  24.             new Person("张三",25),
  25.             new Person("李四",17),
  26.             new Person("王五",35),
  27.     };
  28.     Arrays.sort(people, new PersonComparator()); // 这里需要加入比较器
  29.     System.out.println(Arrays.toString(people));
  30. }
  31. // 当然上述的类为了方便查看,所以专门写出来,可以看到PersonComparator类中只有一个方法,可以使用匿名类的方式来进行编写
  32. public static void main(String[] args) {
  33.     Person[] people = new Person[]{
  34.             new Person("张三",25),
  35.             new Person("李四",17),
  36.             new Person("王五",35),
  37.     };
  38.     Arrays.sort(people, (p1, p2)-> Integer.compare(p1.getAge(), p2.getAge())); // 这样写就不需要类比较器了
  39. //    Arrays.sort(people, Comparator.comparing(Person::getAge)); // 最简写法
  40.     System.out.println(Arrays.toString(people));
  41. }
复制代码
总结
Comparable和Comparator的区别:
java.lang.Comparable:在类界说的时候,可以实现好的接口,内里有compareTo这个方法需要实现。
java.util.Comparator:是挽救的比较接口,需要单独界说一个比较类,内里有compare比较方法。
在设计阶段,我们使用比较多的是Comparable接口。
但在现实开发过程中的话,我们通常使用匿名内部类的方式,所以更多使用的是Comparator,不外一般是在算法题中使用,真正在项目中使用的情况确实不多。
参考:
https://blog.csdn.net/qq_41474648/article/details/105182845

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

老婆出轨

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表