Comparable和Comparator比较实现排序 场景分析

Posted 2019wxw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Comparable和Comparator比较实现排序 场景分析相关的知识,希望对你有一定的参考价值。

 

源码分析 - Collections.sort()

       一、Collection.sort使用

        Collections.sort():是对一个集合进行正向排序的方法首先,传入Collections.sort()的集合的元素类型要继承Comparator<T>,这样才能保证可以比较并排序。

       技术图片

 

 

     根据源码分析,实现方式主要有两种:

     (1)对普通类型和String等类型排序

     (2)对JavaBean某个属性(比如时间,价格,年龄排序)进行排序

   使用案例:

 List<String> listOne = Arrays.asList("3", "2", "5", "8");
        Collections.sort(listOne);//默认升序
        System.out.println("listOne = " + listOne);

        /**
         * 输出结果:
         * listOne = [2, 3, 5, 8]
         */

二、collections.sort对javabean的list进行排序

   算法底层实际是 将集合转换成array,再执行arrays.sort,arrays.sort利用归并排序,优化的快排,timSort等方式。

   2、对string类型数据排序

    分析String源码;

      技术图片

 

 

    因为String类型实现了Comparable<String> 接口,所以可以使用Collections.sort(unSorted)进行排序;

  List<String> unSorted = new ArrayList<String>();
  Collections.sort(unSorted); //String实现了Comparable接口

  注意:由于自定义的javabean未实现,所以不能直接使用,但是可以实现一个比较器:

方式一:

Collections.sort(unSorted,new Comparator<unSortedBean>() {
            @Override
            public int compare(unSortedBean arg0, unSortedBean arg1) {
                // 升叙
                return arg0.getOrder()-arg1.getOrder();
            }
        });
        

方式二

     也可以用collections.sort();方式,只需要javabean实现comparable接口并用compareTo()方法实现升序还是降序;

import java.io.Serializable;

public class unSortedBean implements Serializable, Comparable<unSortedBean>{

    private static final long serialVersionUID = 1L;
    
    private String name;
    private String age;
    private int order;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getAge() {
        return age;
    }
    public void setAge(String age) {
        this.age = age;
    }
    
    public int getOrder() {
        return order;
    }
    public void setOrder(int order) {
        this.order = order;
    }
    @Override
    public int compareTo(unSortedBean arg0) {
        // TODO 升叙
        return this.order-arg0.getOrder();
    }
    

}
注意:如果order是string型数字,需要转换成数字型再比较,否则比较结果可能不是预期效果。

三、Comparable和Comparator区别

1、对于Comparable接口来说,被比较对象所属的类需要直接实现Comparable接口,实现该接口的类被赋予一个自然顺序,而且该自然顺序只有一个,而Comparator是一个比较器接口,被比较对象所属的类不需要直接实现该接口,可以单独写一个比较器类实现该接口,作为比较对象的一个比较器,对于一个类来说,可以实现多个比较器。

2、Comparator可以选择对null进行比较,而Comparable不可以。主要是因为Comparator的比较对象都是是compare方法的参数,而Comparable的比较方法compareTo方法需要对象来调用,而对象为null时(null.compareTo(obj)),会出现异常。
 

重点:Comparable<T> 和 Comparator<T>测试案例:参考地址链接


以上是关于Comparable和Comparator比较实现排序 场景分析的主要内容,如果未能解决你的问题,请参考以下文章

Java 中 Comparable 和 Comparator 比较

数组对象排序:Comparable和Comparator

Java的Comparable内部比较器和Comparator外部比较器

comparable和comparator区别

转载Java中Comparable和Comparator比较

Java中Comparable与Comparator的区别