zoukankan      html  css  js  c++  java
  • Java基础之元素的比较

    前言

    在解读TreeMap源码时,比较器是构造函数的一个参数,如果缺省表示,采用默认比较器。本文笔者来聊聊元素的排序的两个常用接口Comparable和Comparator。

    Comparable

    comparable接口是一个,内部比较器。由于-able是形容词的后缀,因此,它是领域模型中简单对象的特征。因此也叫作内部比较器。如下代码所示,

    1 public class BaseDomain implements Comparable {
    2     
    3     @Override
    4     public int compareTo(Object o) {
    5         return 0;
    6     }
    7 }

    内部比较器,只要在我们的简单domain对象中实现Comparable接口即可。同时我们的domain对象需要实现compateTo方法。如上所示。Comparable是一个泛型接口,一般情况下,以简单对象作为泛型,如下所示,

    1 public class BaseDomain implements Comparable<BaseDomain> {
    2 
    3     @Override
    4     public int compareTo(BaseDomain o) {
    5         return 0;
    6     }
    7 }

    指定泛型的好处是在compareTo时,不需要强制转型。此处要注意的是,Comparable中的泛型不一定是类本身,也可以是其他的对象,比如String,Integer,Class,Annotation等。总之,除了基础数据类型之外,其他类型都可以。只要在实际业务中,泛型的实际类型和比较的算法能够相适配就可以了。

    然而这种内部比较器违背了六大设计原则中的开闭的原则,即已经交付的类中,我们不适合去修改,或者这个类甚至不是我们内部的类,而是其他系统的类,我们更加不能修改,因此。内部比较器显得非常的被动,于是,出现了外部比较器。Comparator。

    Comparator

    Compatator是外部比较器,以-or结尾,这个比较器则是名词,是第三方的比较器,作为平台性质的参与者。代码如下所示,

    1 public class BaseDomainComparator implements Comparator {
    2     @Override
    3     public int compare(Object o1, Object o2) {
    4 
    5         
    6         return 0;
    7     }
    8 }

    同样,和Comparable接口一样,也是一个泛型接口,因此我们制定泛型为BaseDomain。

    1 public class BaseDomainComparator implements Comparator<BaseDomain> {
    2     @Override
    3     public int compare(BaseDomain o1, BaseDomain o2) {
    4 
    5 
    6         return 0;
    7     }
    8 }

    一般的,如果o1大于02返回正数,如果01小于02返回负数,如果相等,返回0。这个比较器,不是简单对象独有的,因此如果需要比较,需要拥有两个或两个以上的对象,而且,这些对象的类型比较要一直。因此这个比较器的命名往往是 简单对象+Comparator来命名。在Java源代码中,最常见的就是Arrays.sort中作为比较器参数进行排序。而在TreeMap源码中的私有成员属性也定义了一个比较器private final Comparator<? super K> comparator;因此,comparator比较器,是一个松耦合的比较器。

  • 相关阅读:
    MongoDB配置多个ConfigDB的问题(笔记)
    Python访问PostGIS(建表、空间索引、分区表)
    Python访问MySQL数据库
    Python访问MongoDB数据库
    Mapnik读取PostGIS数据渲染图片
    Python批量处理CSV文件
    Spring Mongo配置多个Mongos
    hadoop2.2.0_hbase0.96_zookeeper3.4.5全分布式安装文档下载
    【Git】(1)---工作区、暂存区、版本库、远程仓库
    微信扫码支付功能(2)---用户扫码支付成功,微信异步回调商户接口
  • 原文地址:https://www.cnblogs.com/sunshine798798/p/9974102.html
Copyright © 2011-2022 走看看