美文网首页
Comparable vs Comparator

Comparable vs Comparator

作者: 育王净量 | 来源:发表于2019-04-10 21:18 被阅读0次

    sorting 排序

    sorting-in-java
    Java中提供了Arrays.sort()和Collections.sort()方法用来提供排序,其中排序算法使用的是 QuickSort 快速排序算法,并且默认是升序排列,如果使用降序排列,可以使用Collections.reverseOrder()方法做为参数,同时sort方法还提供了局部排序的方法。

    @Test
        public void testA(){
            
            Comparator comparator = (o1, o2) -> 0;
            Comparable comparable = o -> 0;
    
            Integer[] arr = { 13, 7, 6, 45, 21, 9, 101, 102 };
            Arrays.sort(arr, 1, 3);
            System.out.println(Arrays.toString(arr));
            Arrays.sort(arr);
            System.out.println(Arrays.toString(arr));
            Arrays.sort(arr, Collections.reverseOrder());
            System.out.println(Arrays.toString(arr));
            
            String[] str = {"z", "a", "f", "b", "n", "m"};
            Arrays.sort(str, 0, 3);
            System.out.println(Arrays.toString(str));
            Arrays.sort(str);
            System.out.println(Arrays.toString(str));
            Arrays.sort(str, Collections.reverseOrder());
            System.out.println(Arrays.toString(str));
        }
        
        @Test
        public void testB(){
            List<Integer> list = Arrays.asList(13, 7, 6, 45, 21, 9, 101, 102 );
            Collections.sort(list);
            System.out.println(list);
            Collections.sort(list, Collections.reverseOrder());
            System.out.println(list);
            
            List<String> strList = Arrays.asList("z", "a", "f", "b", "n", "m");
            Collections.sort(strList);
            System.out.println(strList);
            Collections.sort(strList, Collections.reverseOrder());
            System.out.println(strList);
        }
    

    comparable-vs-comparator

    // 独立的比较器
    import java.util.Comparator;
    
    // 需要类实现接口,重写compareTo方法
    import java.lang.Comparable;
    

    与此同时sort方法还可以接收Comparator比较器做为参数来实现自定义排序。Comparable 可以让实现它的类的对象进行比较,类内部要实现 compareTo 方法。

    class A implements Comparable<A>{
        private int a;
        
        /**
         * - a1.compareTo(a2) > 0 即 a1 > a2
         * - a1.compareTo(a2) = 0 即 a1 = a2
         * - a1.compareTo(a2) < 0 即 a1 < a2
         */
        @Override
        public int compareTo(A o) {
            
            // 兼容NP场景;
            if(Objects.isNull(o)) return 1;
            return a - o.a;
        }
        
        public static void main(String[] args) {
            A a = new A();
            System.out.println(a.compareTo(null));
        }
    }
    

    自然排序需要类实现 Comparable接口,同时重写 comparaTo 方法。Comparator 则是在外部制定排序规则,然后作为排序策略参数传递给某些类,比如 Collections.sort(), Arrays.sort(), 或者一些内部有序的集合(比如 SortedSet,SortedMap 等)。

    class A {
        private int a;
        private static final Comparator<A> comparator = (o1, o2) -> o1.a - o2.a;
        
        public static void main(String[] args) {
            A[] array = { new A(2), new A(1), new A(3)};
            Arrays.sort(array, comparator);
            for (A a : array) {
                System.out.println(a.a);
            }
        }
        
        public A(int a){
            this.a = a;
        }
    }
    

    参考

    相关文章

      网友评论

          本文标题:Comparable vs Comparator

          本文链接:https://www.haomeiwen.com/subject/lltaiqtx.html