gpt4 book ai didi

Java 使用 Steams VS TreeMap 对 map 进行排序

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:00:43 25 4
gpt4 key购买 nike

考虑以下 Java HashMap。

Map<String, String> unsortMap = new HashMap<String, String>();
unsortMap.put("Z", "z");
unsortMap.put("B", "b");
unsortMap.put("A", "a");
unsortMap.put("C", "c");

现在我想按键对这个 map 进行排序。为此,我可以选择使用 TreeMap。

Map<String, String> treeMap = new TreeMap<String, String>(unsortMap);

我的另一个选择是将 Java Streams 与 Sorted() 结合使用,如下所示。

Map<String, Integer> sortedMap = new HashMap<>();
unsortMap.entrySet()
.stream()
.sorted(Map.Entry.comparingByKey())
.forEachOrdered(x -> sortedMap.put(x.getKey(), x.getValue()));

在这两个选项中,哪个选项是首选,为什么(可能是在性能方面)?

谢谢

最佳答案

正如其他人指出的那样,将排序后的条目流转储到常规 HashMap 中什么都不做... LinkedHashMap是合乎逻辑的选择。

但是,上述方法的替代方法是充分利用 Stream Collectors应用程序接口(interface)。

Collectors有一个 toMap允许您为 Map 提供替代实现的方法.所以不是 HashMap你可以要一个LinkedHashMap像这样:

unsortedMap.entrySet()
.stream()
.sorted(Map.Entry.comparingByKey())
.collect(Collectors.toMap(
Map.Entry::getKey,
Map.Entry::getValue,
(v1, v2) -> v1, // you will never merge though ask keys are unique.
LinkedHashMap::new
));

在使用 TreeMap 与 LinkedHashMap 之间...构造的复杂性可能与 O(n log n) 相同...显然 TreeMap如果您打算继续向其中添加更多元素,解决方案是一种更好的方法...我想您应该从 TreeMap 开始在这种情况下。 LinkedHashMap选项的优点是在链接或原始未排序的 map 上查找将是 O(1),而 TreeMap 的类似于 O(log n)。因此,如果您需要保留未排序的映射以进行高效查找,而在构建 LinkedHashMap 时,您可以丢弃原始未排序的映射(从而节省一些内存)。

使用 LinkedHashMap 提高效率你应该在构造时提供所需大小的良好估算器,这样就不需要动态调整大小,所以而不是 LinkedHashMap::new你说() -> new LinkedHashMap<>(unsortedMap.size()) .

我认为使用 TreeMap更整洁...因为使代码更小,所以除非存在可以使用未排序和排序的链接映射方法解决的实际性能问题,否则我将使用 Tree .

关于Java 使用 Steams VS TreeMap 对 map 进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54263941/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com