【问题标题】:While sorting a collection or any data set, How does reverse ordering works in Java 8?在对集合或任何数据集进行排序时,Java 8 中的反向排序如何工作?
【发布时间】:2019-09-29 00:39:40
【问题描述】:

我正在从 stackoverflow 上的示例/问题中学习 Java 8,同时解决一些算法问题。我有疑问:当使用 Comparator.reverseOrder() 或 reversed() 时,JVM 是否理解我想要反向顺序,因此它以这样一种方式应用逻辑,即在对自身进行排序时,顺序以降序方式保持。或者 JVM 再通过一次 (O(n)) 将升序数据结构更改为降序数据结构。

int[][] arr= new int[][]{{1,4},{3,5}};
Arrays.sort(arr, Comparator.<int[]>comparingInt(a -> a[0]).reversed());

另一个地图的例子,我在地图trackW上执行了一些我没有复制到这里的操作。

Map<String,Integer> hmsort= new LinkedHashMap<>();
Map<String,Integer> trackW = new HashMap<>();

trackW.entrySet()
            .stream()
            .sorted(Map.Entry.<String,Integer>comparingByValue().
                    thenComparing(Map.Entry.comparingByKey(Comparator.reverseOrder())))
            .forEachOrdered(x->hmsort.put(x.getKey(),x.getValue()));

另外,如果有人可以修复/建议以这种方式对 hashmap 进行排序的更好选择(基于值升序,然后基于键降序),我将非常高兴。

问候。

【问题讨论】:

  • 你可以阅读the source code yourself;此外,您通常可以假设 OpenJDK 质量的系统的开发人员会采取明显改进的方法,而不是做一些效率过低的事情。
  • 谢谢。我会看看代码。是的,这是我的假设,但只是想确认一下。

标签: java sorting lambda java-8


【解决方案1】:

当使用 Comparator.reverseOrder() 或 reversed() 时,JVM 是否理解我想要反向顺序,因此它以这样一种方式应用逻辑,即在对自身进行排序时,顺序以降序方式保持。

是的。比较器本身是相反的。不是先排序后反转的集合。

比较器内部的“逻辑”对调用代码(更不用说“JVM”)不可见,排序算法只是调用比较器(一次处理两个值)并查看结果。因此,调用代码(例如Arrays.sort)不知道比较器是“正常”版本还是反转版本。

【讨论】:

    猜你喜欢
    • 2014-06-01
    • 2011-10-20
    • 2019-04-24
    • 1970-01-01
    • 2011-04-04
    • 1970-01-01
    • 2020-04-07
    相关资源
    最近更新 更多