前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【每日知识】Comparable你知道多少?

【每日知识】Comparable你知道多少?

作者头像
Python进击者
发布2020-02-24 12:44:08
3750
发布2020-02-24 12:44:08
举报

Comparable你知道多少?

jdk1.2新增的接口,位于java.lang包下。在jdk5时Comparable<Object>改成了Comparable<T>

功能:

用于对象的排序或者对象的分组

介绍:

Comparable接口强行对实现它的类的每个实例进行自然排序,该接口的唯一方法compareTo方法被称为自然比较方法;强烈建议自然排序和equals一致(就是两个对象调用compareTo方法和调用equals方法返回的布尔值应该一样)

方法:

int compareTo(Object  o)  

利用当前对象和传入的目标对象进行比较,

若是当前对象比目标对象大,则返回1,那么当前对象会排在目标对象的后面

若是当前对象比目标对象小,则返回-1,那么当前对象会排在目标对象的后面

若是两个对象相等,则返回0

例子①:对狗狗按照年龄进行升序排序

public class Main {
public static void main(String[]args){
    List list = new ArrayList();
    list.add(new Dog(6,"旺财"));
    list.add(new Dog(3,"皮诺"));
    list.add(new Dog(5,"子弹"));

    for(int i=0;i<list.size();i++){
          System.out.println(list.get(i).toString());
    }
    Collections.sort(list);
    System.out.println("调用sort排序后");
    for(int i=0;i<list.size();i++){
          System.out.println(list.get(i).toString());
    }
  }
}

class Dog implements Comparable{
      public int age;
      public String name;
      public Dog(int age,String name){
      this.age=age;
      this.name=name;
      }

      @Override
      public String toString(){
      return "Dog [age="+age+",name="+name+"]";
      }

      @Override
      public int compareTo(Object o) {
      // TODO Auto-generated method stub
      Dog d =(Dog)o;
      if(this.age>d.age) return 1;
      if(this.age<d.age) return -1;
      return 0;
      }
}

输出结果:

思考:

如何进行降序呢?

答:在重写compareTo方法时,可以反过来写,如果当前狗狗的年龄对目标狗狗的年龄大的话,则返回-1。这样就可以达到降序的目的

例子①扩展:

如果使用一些自带排序的集合容器,那么还会按照我们compareTo中定义的那样来排序吗?

仅对主函数进行修改

public class Main {
public static void main(String[]args){
    Set<Dog> set = new TreeSet();
    set.add(new Dog(6,"旺财"));
    set.add(new Dog(3,"皮诺"));
    set.add(new Dog(5,"子弹"));

    for(Dog d:set){
    System.out.println(d.toString());
    }

    }
}

输出结果:

由此可得结论

若是A类实现了Compareble接口,并且重写了compareTo()方法

①:当你在使用Collections/Arrays的sort对该A的对象集合进行排序时,它会按照compareTo()方法中定义的那样进行排序

②:当你使用会自动排序的容器(TreeSet、TreeMap)来存A的对象时,它也会按照compareTo()方法中定义的那样进行排序

③:这个只是简单的根据年龄进行比较,在一些场景下可以写的更丰富,比如在年龄相等的情况下根据其他的东西进行排序等

质疑:

网上很多人都说Comparable是一个排序的接口,事实真的是如此吗?

解答:

因为Comparable在排序上用的比较多,所以很多人对它有误解。其实Comparable是一个比较器,只是用来比较两个对象的区别,除了排序,它还可以用来进行分组(还有其他作用,这里不深究)

缺点:

Comparable和目标类的耦合度太高,如果对比较算法不满意,或者目标类没有实现Comparable接口,就得对原来的代码进行修改,这一点不符合设计模式的开闭原则(对扩展开放,对修改关闭)

来源: https://www.cnblogs.com/lin-/p/8006712.html


本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-02-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python进击者 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档