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

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作为结果,那就按升序进行排序,否则就是按降序排序

猜你喜欢

转载自jjhpeopl.iteye.com/blog/2408452