gpt4 book ai didi

java - 使用 Java 8 合并、排序和限制 Map 流

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

我有两张 map Map<String, Long> .我想合并两个 map ,按降序排序,并获得前 5 个。如果合并中有重复键,我需要对值求和。我有以下有效的代码:

Map<String, Long> topFive = (Stream.concat(map1.entrySet().stream(), 
map2.entrySet().stream())
.collect(Collectors.toMap(Map.Entry::getKey,
Map.Entry::getValue,
Long::sum)))
.entrySet()
.stream()
.sorted(Map.Entry.comparingByValue(Comparator.reverseOrder()))
.limit(5)
.collect(Collectors.toMap(Map.Entry::getKey,
Map.Entry::getValue,
(v1, v2) -> v1,
LinkedHashMap::new));

但我想知道是否有更好的解决方案。

最佳答案

如果您在性能方面的意思是更好,并且您有大量集合,并且只需要很少的顶部元素,您可以避免对整个 map 进行排序,给定n*log(n) 复杂度。

如果你已经有 Guava,你可以使用 MinMaxPriorityQueue只存储最好的 N 个结果。然后只需对这几个常量 N 元素进行排序。

Comparator<Entry<String, Long>> comparator = Entry.comparingByValue(reverseOrder());

Map<String, Long> merged = Stream.of(map1, map2)
.map(Map::entrySet)
.flatMap(Set::stream)
.collect(Collectors.toMap(Map.Entry::getKey,
Map.Entry::getValue,
Long::sum));

MinMaxPriorityQueue<Entry<String, Long>> tops = MinMaxPriorityQueue.orderedBy(comparator)
.maximumSize(5)
.create(merged.entrySet());

Map<String, Long> sorted = tops.stream()
.sorted(comparator)
.collect(Collectors.toMap(Map.Entry::getKey,
Map.Entry::getValue,
(m1, m2) -> m1,
LinkedHashMap::new));

如果您没有/不想使用 Guava,您可以使用自定义 TreeMap 模拟 MinMaxPriorityQueue(也是一个在构造函数中接收最大大小的类可以创建,如果你不想使用匿名类[这是为了展示功能])。

Set<Entry<String, Long>> sorted = new TreeSet<Entry<String, Long>>(comparator) {
@Override
public boolean add(Entry<String, Long> entry) {
if (size() < 5) { // 5 can be constructor arg in custom class
return super.add(entry);
} else if (comparator().compare(last(), entry) > 0) {
remove(last());
return super.add(entry);
} else {
return false;
}
}
};

然后将所有元素添加到带有 top 的集合中。

sorted.addAll(merged);

您还可以更改合并功能,以使用类似于 Federico 提到的合并功能。

Map<String, Long> merged = new HashMap<>(map1);
map2.forEach((k, v) -> merged.merge(k, v, Long::sum));

这往往比使用流更快,之后,一旦你有了合并的 map ,你就可以使用 MinMaxPriorityQueueTreeSet 选择前 N 个元素,避免再次不需要对整个集合进行排序。

关于java - 使用 Java 8 合并、排序和限制 Map 流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49408489/

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