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作为结果,那就按升序进行排序,否则就是按降序排序
上一篇: 样式表的使用
下一篇: Weblogic9扩展JAAS应用注意点
推荐阅读
-
velocity显示List与Map的方法详细解析
-
Java Collections.sort()实现List排序的默认方法和自定义方法
-
velocity显示List与Map的方法详细解析
-
Java Collections.sort()实现List排序的默认方法和自定义方法
-
Java list利用遍历进行删除操作3种方法解析
-
通过实例解析Java List正确使用方法
-
浅谈Java中Collections.sort对List排序的两种方法
-
C# 中的List.Sort()--集合排序方法全面解析
-
C#中将DataTable转化成List
的方法解析 -
Java list利用遍历进行删除操作3种方法解析