zoukankan      html  css  js  c++  java
  • 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>测试案例:参考地址链接

    
    
    Java半颗糖
  • 相关阅读:
    简单选择排序就是简单~~~
    快速排序的性能和名字一样优秀
    网关Ocelot功能演示完结,久等了~~~
    打个赌,用得最多的冒泡排序肯定少了个关键点
    C7 : 进程环境
    Java Native Interface Specification
    JNI简易开发
    Java Native Interface Specification
    MultilingualSimpleObject
    Java Native Interface Specification
  • 原文地址:https://www.cnblogs.com/2019wxw/p/12217316.html
Copyright © 2011-2022 走看看