FH个人博客

愿居于一城,与卿所见美好......

推荐文章

Comparator和Comparable比较器对比

    1.Comparable

         Comparable是排序接口,当一个类实现了Comparable接口后,就以为着该类支持排序。实现了Comparable接口的类,其组成的数组和列表就可以通过Collections的工具进行自动排序。

          而实现了Comparable接口的对象也可以用作有序映射(LinkedHashMap)中的键,或者有序集合中的集合,无序指定比较器Comparator。

    复制代码
    public class Person implements Comparable<Person> {
        private String name;
        private int id;
        private int age;
    
        public String getName(){return name;}
        public int getId(){ return id;}
        public int getAge(){return age;}
        public void setName(String name){this.name=name;}
        public void setId(int id){this.id=id;}
        public void setAge(int age){this.age = age;}
    
        @Override
        public int compareTo(Person p) {
            if(age<p.getAge())
                return 1;
            else
                return -1;
        }
    }
    复制代码

    你可以在重写的compareTo方法中实现更加复杂的比较,而返回的值决定其是升序还是降序,具体如下:

    返回值A>BA<B
    return 1升序  降序
    return -1降序升序

    此时实现一个Person的表

    复制代码
     List<Person> list = new ArrayList<>();
    
            for(int i = 0; i<10; i++ ){
                Person person = new Person();
                person.setId(i);
                person.setName("person-"+i);
                person.setAge(i*5);
                list.add(person);
            }
    复制代码

    调用Collections.sort结果为:降序

    [Name=hero-9,Id=9,Age=45], [Name=hero-8,Id=8,Age=40], [Name=hero-7,Id=7,Age=35], [Name=hero-6,Id=6,Age=30], [Name=hero-5,Id=5,Age=25], [Name=hero-4,Id=4,Age=20]

    如果改变在Person中重写的compareTo的返回值,则结果为 升序

     

    [Name=hero-0,Id=0,Age=0], [Name=hero-1,Id=1,Age=5], [Name=hero-2,Id=2,Age=10], [Name=hero-3,Id=3,Age=15], [Name=hero-4,Id=4,Age=20], [Name=hero-5,Id=5,Age=25], [Name=hero-6,Id=6,Age=30]

     

    2.Comparator

         Comparator是比较器接口,我们如果需要控制某个类的次序,而该类本身不支持排序(即没有实现Comparable接口),那么我们就可以建立一个“该类的比较器”来进行排序,这个“比较器”只需要实现Comparator接口即可。也就是说,我们可以通过实现Comparator来新建一个比较器,然后通过这个比较器对类进行排序。

    我们可以直接创建一个比较器,然后来重写其比较方法:

    复制代码
    Comparator<Person> cp = new Comparator<Person>() {
                @Override
                public int compare(Person o1, Person o2) {
                    return 0;
                }
            };
    复制代码

    或者创建一个比较器类,实现Comparator接口,重写其中的方法,并在Collections.sort()中调用:

    复制代码
    public class PersonComparator implements Comparator<Person> {
        @Override
        public int compare(Person o1,Person o2) {
            return 0;
        }
    }
    复制代码

     

    3.两者的区别

     

    Comparable是排序接口,若一个类实现了Comparable接口,就意味着“该类支持排序”。而Comparator是比较器,我们若需要控制某个类的次序,可以建立一个“该类的比较器”来进行排序。

      Comparable相当于“内部比较器”,而Comparator相当于“外部比较器”。

      两种方法各有优劣, 用Comparable 简单, 只要实现Comparable 接口的对象直接就成为一个可以比较的对象,但是需要修改源代码。 用Comparator 的好处是不需要修改源代码, 而是另外实现一个比较器, 当某个自定义的对象需要作比较的时候,把比较器和对象一起传递过去就可以比大小了, 并且在Comparator 里面用户可以自己实现复杂的可以通用的逻辑,使其可以匹配一些比较简单的对象,那样就可以节省很多重复劳动了。

    阅读全文>>

作者:FH分类:【javaEE浏览(204评论(0

2020-11-27 17:12:45