使用Java 8合并,排序和限制Map流
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了使用Java 8合并,排序和限制Map流,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2134字,纯文字阅读大概需要4分钟。
内容图文
![使用Java 8合并,排序和限制Map流](/upload/InfoBanner/zyjiaocheng/669/e6a12a63ad8e4357987c34c3a69386b5.jpg)
我有两张地图Map< String,Long>.我要合并两个地图,以降序排序,并获得前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));
但我想知道是否有更好的解决方案.
解决方法:
如果您的意思是更好的性能,并且您有大量的集合,并且只需要几个顶级元素,那么考虑到n * log(n)的复杂性,就可以避免对整个地图进行排序.
如果您已经拥有番石榴,则可以使用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));
如果您没有/不想使用番石榴,则可以通过使用自定义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;
}
}
};
然后将所有元素添加到顶部.
sorted.addAll(merged);
您还可以更改合并功能,以使用类似于Federico提到的合并的功能.
Map<String, Long> merged = new HashMap<>(map1);
map2.forEach((k, v) -> merged.merge(k, v, Long::sum));
与使用流相比,这往往会更快,然后,有了合并的映射后,可以使用MinMaxPriorityQueue或TreeSet选择前N个元素,从而避免了不必要对整个集合进行排序的麻烦.
内容总结
以上是互联网集市为您收集整理的使用Java 8合并,排序和限制Map流全部内容,希望文章能够帮你解决使用Java 8合并,排序和限制Map流所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。