You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Java 8合并Map、排序并获取Top5的技术实现

合并两个Map并获取值Top5的完整实现

没问题,我帮你把这段代码补全并优化,同时拆解每一步的逻辑,让你清楚整个流程:

完整可运行代码

import java.util.Comparator;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class MapMergeTopFive {
    public static void main(String[] args) {
        // 示例输入Map
        Map<String, Long> map1 = Map.of("Apple", 15L, "Banana", 20L, "Cherry", 10L);
        Map<String, Long> map2 = Map.of("Banana", 10L, "Cherry", 25L, "Date", 30L, "Elderberry", 22L, "Fig", 35L);

        // 合并、求和、排序取Top5,返回有序Map
        Map<String, Long> topFiveMap = Stream.concat(map1.entrySet().stream(), map2.entrySet().stream())
                // 第一步:合并两个Map的条目,重复key时对值求和
                .collect(Collectors.toMap(
                        Map.Entry::getKey,
                        Map.Entry::getValue,
                        Long::sum // 重复键的合并逻辑:值相加
                ))
                .entrySet()
                .stream()
                // 第二步:按值降序排序
                .sorted(Map.Entry.comparingByValue(Comparator.reverseOrder()))
                // 第三步:只保留前5个元素
                .limit(5)
                // 第四步:收集成LinkedHashMap,保证排序后的顺序不丢失
                .collect(Collectors.toMap(
                        Map.Entry::getKey,
                        Map.Entry::getValue,
                        (oldVal, newVal) -> oldVal, // 此处不会触发,因为已去重
                        LinkedHashMap::new
                ));

        // 如果你只需要条目列表(更简单,天然保留顺序)
        List<Map.Entry<String, Long>> topFiveList = 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.toList());

        // 输出结果
        System.out.println("Top5 Map(有序):" + topFiveMap);
        System.out.println("Top5 条目列表:" + topFiveList);
    }
}

分步逻辑解释

  • 合并并求和:用Stream.concat把两个Map的条目流合并,再通过Collectors.toMap收集到新Map,第三个参数Long::sum指定遇到重复键时,把两个值相加。
  • 按值降序排序:将合并后的Map转成条目流,用Map.Entry.comparingByValue(Comparator.reverseOrder())实现按值从大到小排序。
  • 取前5个元素:用limit(5)截断流,只保留排序后的前5个条目。
  • 保持顺序:收集结果时如果用普通HashMap会丢失排序后的顺序,所以用LinkedHashMap::new指定有序Map;如果只需要条目列表,直接用Collectors.toList()更方便。

注意事项

  • 该方案适用于Java 8及以上版本,依赖Stream API特性。
  • 如果你的Map是线程安全的(比如ConcurrentHashMap),合并时要注意线程同步,不过单线程场景下无需额外处理。

内容的提问来源于stack exchange,提问作者nufar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:42:26