zoukankan      html  css  js  c++  java
  • Java面试题详解三:比较器

    一,Comparable和Comparator
    1.Comparable可以认为是一个内比较器,实现了Comparable接口的类有一个特点,就是这些类是可以和自己比较。
    Comparable接口中只有一个compareTo()方法,实现Comparable接口就意味着要实现该方法,该方法也就是实现定制化比较策略的地方

    例如:

    public class Domain implements Comparable<Domain>{
        //Comparable接口后的<Domain>类是要与继承该接口的类比较
        private String str;
        public Domain(String str)
        {
            this.str = str;
        }
    
        public int compareTo(Domain domain){
            if (this.str.compareTo(domain.str) > 0)
                return 1;
            else if (this.str.compareTo(domain.str) == 0)
                return 0;
            else 
                return -1;
        }
        
        public String getStr(){
            return str;
        }
    }

    前面说实现Comparable接口的类是可以支持和自己比较的,但是其实代码里面Comparable的泛型未必就一定要是Domain,将泛型指定为String或者指定为其他任何任何类型都可以----只要开发者指定了具体的比较算法就行

    所以想使用Comparable接口进行比较时,需要:
    (1).实现Comparable接口,并指定泛型里的要比较的类型
    (2).重写compareTo方法
    使用场景:如果开发者add进入一个Collection的对象想要Collections的sort方法帮你自动进行排序的话,那么这个对象必须实现Comparable接口。

    2.Comparator可以认为是是一个外比较器,个人认为有两种情况可以使用实现Comparator接口的方式:
    (1).一个对象不支持自己和自己比较(没有实现Comparable接口,在某些情况下,你可能不想或者不能去修改类的源代码。同时,你又希望可以基于对象的某些属性或字段去比较对象的大小,此时,我们就可以让该某类实现Comparator接口),但是又想对两个对象进行比较
    2、一个对象实现了Comparable接口,但是开发者认为compareTo方法中的比较方式并不是自己想要的那种比较方式
    Comparator接口里面有一个compare方法,方法有两个参数T o1和T o2,是泛型的表示方式,分别表示待比较的两个对象

    public class DomainComparator implements Comparator<Domain>
    {
        public int compare(Domain domain1, Domain domain2)
        {
            if (domain1.getStr().compareTo(domain2.getStr()) > 0)
                return 1;
            else if (domain1.getStr().compareTo(domain2.getStr()) == 0)
                return 0;
            else 
                return -1;
        }
    }
    public static void main(String[] args)
    {
        Domain d1 = new Domain("c");
        Domain d2 = new Domain("c");
        Domain d3 = new Domain("b");
        Domain d4 = new Domain("d");
        DomainComparator dc = new DomainComparator();
        System.out.println(dc.compare(d1, d2));
        System.out.println(dc.compare(d1, d3));
        System.out.println(dc.compare(d1, d4));
    }
  • 相关阅读:
    利用QObject反射实现jsonrpc
    使用libuv实现生产者和消费者模式
    std::function赋值的几种方法
    Qt postEvent
    Qt由pcm数据生成wav文件
    Qt websocket协议的实现
    Python中json.dump() 和 json.dumps()的区别
    Appium环境搭建(Mac)
    Mac上搭建Python集成环境
    Mac OS终端利器iTerm2(完美替代bash)
  • 原文地址:https://www.cnblogs.com/inspred/p/9526299.html
Copyright © 2011-2022 走看看