java Comparator接口中(底层源码)compare方法决定排序的升序降序问题

转载 2018年04月16日 22:40:23

转自CSDN论坛,稍加整理和总结 点击打开链接

Comparator升序降序实现
int compare(Object o1, Object o2) 返回一个基本类型的整型
1) 如果要按照升序排序,
则o1 小于o2,返回-1(负数),相等返回0,01大于02返回1(正数)
那这是为什么呢?通过底层源码了解一下:

public static <T> void sort(T[] a, Comparator<? super T> c) {
        if (c == null) {
            sort(a);
        } else {
            if (LegacyMergeSort.userRequested)
                legacyMergeSort(a, c);
            else
                TimSort.sort(a, 0, a.length, c, null, 0, 0);
        }
    }

可以看出应该是进入到了else中的if,那么legacyMergeSort是个什么鬼呢,继续往下看

 private static <T> void legacyMergeSort(T[] a, Comparator<? super T> c) {
        T[] aux = a.clone();
        if (c==null)
            mergeSort(aux, a, 0, a.length, 0);
        else
            mergeSort(aux, a, 0, a.length, 0, c);
    }

就是他了,可以看出来这里也应该是进入到了else中,那么继续往下看,mergesort又是个什么鬼呢。

 private static void mergeSort(Object[] src,
                                  Object[] dest,
                                  int low, int high, int off,
                                  Comparator c) {
        int length = high - low;
 
        // Insertion sort on smallest arrays
        if (length < INSERTIONSORT_THRESHOLD) {
            for (int i=low; i<high; i++)
                for (int j=i; j>low && c.compare(dest[j-1], dest[j])>0; j--)
                    swap(dest, j, j-1);
            return;
        }
 
        // Recursively sort halves of dest into src
        int destLow  = low;
        int destHigh = high;
        low  += off;
        high += off;
        int mid = (low + high) >>> 1;
        mergeSort(dest, src, low, mid, -off, c);
        mergeSort(dest, src, mid, high, -off, c);
 
        // If list is already sorted, just copy from src to dest.  This is an
        // optimization that results in faster sorts for nearly ordered lists.
        if (c.compare(src[mid-1], src[mid]) <= 0) {
           System.arraycopy(src, low, dest, destLow, length);
           return;
        }
 
        // Merge sorted halves (now in src) into dest
        for(int i = destLow, p = low, q = mid; i < destHigh; i++) {
            if (q >= high || p < mid && c.compare(src[p], src[q]) <= 0)
                dest[i] = src[p++];
            else
                dest[i] = src[q++];
        }
    }
这段代码就比较长了,重点来了(敲黑板!!!)
 for (int j=i; j>low && c.compare(dest[j-1], dest[j])>0; j--)
                    swap(dest, j, j-1);
这个看到了么,如果调用compare方法大于0,就把前一个数和后一个数交换,也就是把大的数放后面了,即所谓的升序了。那么再想想看return arg0-arg1是不是返回的与这里正好匹配呢。差不多说这么多,相信你应该明白了。

数据结构基础系列(9):排序

-
  • 1970年01月01日 08:00

java 自定义排序【Comparator升序降序的记法】

环境java: 1.7需求今天在写排序时,忘了是返回1,是正序,还是-1为正序。 或者说,正序或者降序我应该如何返回。例子说明Collections.sort(companyList, new Co...
  • u013066244
  • u013066244
  • 2017-12-25 18:57:26
  • 542

Comparable、Comparator区别、Comparator升序降序实现

Comparable与Comparator的区别 可参考: http://blog.csdn.net/mageshuai/article/details/3849143 总结: 1) 用 Co...
  • Angelkeepmoving
  • Angelkeepmoving
  • 2016-08-12 13:52:11
  • 5839

怎么根据Comparable方法中的compareTo方法的返回值的正负 判断升序 还是 降序?

public int compareTo(Student o) {         return this.age - o.age; // 比较年龄(年龄的升序)     } 应该理解成retu...
  • alinshen
  • alinshen
  • 2017-05-24 08:09:02
  • 1849

Collections的sort方法加上Comparator后,是如何排序的

Collections的sort方法加上Comparator后,是如何排序的我们来看看Comparator的compare方法的注释 我们看到returns下方的信息,看完大家都知道怎么回事,但是这...
  • newmandirl
  • newmandirl
  • 2016-03-16 23:47:55
  • 1352

Java排序之Comparable接口和Comparator接口的比较和应用示例

Camparable接口和Comparator接口的比较和应用示例
  • zolalad
  • zolalad
  • 2014-06-11 15:39:51
  • 4543

Comparator 升序降序

Comparator  comp = new MyComparator();                Collections.sort(abTypeInfeList,comp); ...
  • poortess
  • poortess
  • 2017-12-12 11:47:44
  • 121

java comparator 升序、降序、倒序从源码角度理解

环境 jdk:1.7+ 前言 之前我写过关于comparator的理解,但是都理解错了。 java 自定义排序【Comparator升序降序的记法】 特别是 上面这篇,完全理解错了,排序...
  • u013066244
  • u013066244
  • 2018-01-07 21:35:20
  • 624

Java集合排序之compareTo&compare 接口 compareable & comparator

区别: 相同:comparable 和 Comparator 都是用来实现集合中的排序的(不是集合实现了这两接口,是集合里装的东西会去实现这两个接口) 区别: Comparable是在集...
  • zqs62761130
  • zqs62761130
  • 2015-01-28 18:51:41
  • 3012

Arrays.sort排序方法以及Comparator和Comparable接口的作用

有的时候需要对数组里的element进行排序。当然可以自己编写合适的排序方法,但既然Java包里有自带的Arrays.sort排序方法,在数组元素比较少的时候为何不用?   Sorting an A...
  • you18131371836
  • you18131371836
  • 2017-02-28 12:21:15
  • 884
收藏助手
不良信息举报
您举报文章:java Comparator接口中(底层源码)compare方法决定排序的升序降序问题
举报原因:
原因补充:

(最多只允许输入30个字)