欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Collections.sort(List, Comparator)方法解析

程序员文章站 2022-04-16 23:36:28
...

Collections.sort()方法有两种参数类型,如下:

Collections.sort(List<T> list),直接给定需要排序的list,然后按照自然排序进行排序。

Collections.sort(List<T> list,Comparator<? super T> c),这个方法需要提供比较器,然后排序时会根据比较器的实现逻辑进行排序。

简单看一下提供比较器的方法实现,里面有一段代码需要注意,这段代码其实就是最终决定了排序时是升序还是降序。

private static <T> int countRunAndMakeAscending(T[] a, int lo, int hi,
                                                Comparator<? super T> c) {
    assert lo < hi;
    int runHi = lo + 1;
    if (runHi == hi)
        return 1;

    // Find end of run, and reverse range if descending
 if (c.compare(a[runHi++], a[lo]) < 0) { // Descending
 while (runHi < hi && c.compare(a[runHi], a[runHi - 1]) < 0)
            runHi++;
        reverseRange(a, lo, runHi);
    } else {                              // Ascending
 while (runHi < hi && c.compare(a[runHi], a[runHi - 1]) >= 0)
            runHi++;
    }

    return runHi - lo;
}

看以上代码,主要关注两点:

1、使用提供的比较器进行值比较时,传递进去的第一个参数是队列后面的值,传递的第二个参数是队列前面的值

2、即使比较器返回的是小于0,按照desc方式排序了,但最后会调用reverseRange方法,进行排序反转,也就是最终都是按大于0的方式进行的排序

以上两点不难总结出:

1、队列第一个值大于第二个值的情况下:

  • 比较器中用参数1减去参数2作为结果,实际是队列中的第二个值减去第一个值,按升序进行排序
  • 比较器中用参数2减去参数1作为结果,实际是队列中的第一个值减去第二个值,按降序进行排序

2、队列第一个值小于第二个值的情况下:

  • 比较器中用参数1减去参数2作为结果,实际是队列中的第二个值减去第一个值,按升序进行排序
  • 比较器中用参数2减去参数1作为结果,实际是队列中的第一个值减去第二个值,按降序进行排序

针对以上总结,很容易看出,是升序还是降序,其实跟队列第一个值和第二个值的大小没有关系,直接和比较器实现的逻辑有关系。

比较器中若是参数1减去参数2作为结果,那就按升序进行排序,否则就是按降序排序