当前位置: 首页 > news >正文

317. Java Stream API - 使用 groupingBy() 构建直方图并提取最大值

文章目录

  • 317. Java Stream API - 使用 `groupingBy()` 构建直方图并提取最大值
      • ✅ Part 1:构建直方图(Histogram)
      • ✅ Part 2:提取最大值(提取出现次数最多的字符串长度)
        • 📌 方法一:用 `Map.Entry` 直接找最大值
      • ⚠️ Part 3:多个最大值时如何处理?
      • ✅ Part 4:如何提取所有最大值(Map 反转技巧)
    • ✅ 总结

317. Java Stream API - 使用groupingBy()构建直方图并提取最大值

✅ Part 1:构建直方图(Histogram)

我们有一个字符串列表,想要统计每种字符串长度的出现次数。这个任务可以通过Collectors.groupingBy配合Collectors.counting()来完成:

Collection<String>strings=List.of("one","two","three","four","five","six","seven","eight","nine","ten","eleven","twelve");Map<Integer,Long>histogram=strings.stream().collect(Collectors.groupingBy(String::length,Collectors.counting()));histogram.forEach((length,count)->System.out.println(length+" :: "+count));

🖨 输出:

3::44::35::36::2

🔍 说明:

  • String::length是分组键:字符串的长度。
  • Collectors.counting()是统计该组中元素的数量。
  • 最终结果是一个直方图:键是字符串长度,值是该长度出现的次数。

✅ Part 2:提取最大值(提取出现次数最多的字符串长度)

📌 方法一:用Map.Entry直接找最大值

我们想要从直方图中找到数量最多的那组。例如上面例子中,3 :: 4是数量最多的(长度为3的字符串有4个)。

Map.Entry<Integer,Long>maxValue=histogram.entrySet().stream().max(Map.Entry.comparingByValue()).orElseThrow();System.out.println("maxValue = "+maxValue);

🖨 输出:

maxValue=3=4

📌 小技巧:

  • entrySet().stream()是将 Map 转换为流。
  • Map.Entry.comparingByValue()是基于值的比较器。
  • orElseThrow()是保险措施,避免空结果。

⚠️ Part 3:多个最大值时如何处理?

如果出现多个 key 拥有相同的最大 value,那么上面方法只能选出一个,其他会被忽略。例如:

Collection<String>strings=List.of("two","three","four","five","six","seven","eight","nine","ten","eleven","twelve");

输出的直方图:

3::34::35::36::2

👀 问题:有三个长度(3、4、5)的字符串数量都是 3。

如果你用.max(),只会返回其中之一,可能会遗漏其他候选最大值。


✅ Part 4:如何提取所有最大值(Map 反转技巧)

🎯 思路: 我们可以将直方图反转,把 “数量” 作为 key,“长度” 作为 value(或 List of value):

Map<Long,List<Integer>>reversed=histogram.entrySet().stream().collect(Collectors.groupingBy(Map.Entry::getValue,// 用 count 作为 keyCollectors.mapping(Map.Entry::getKey,// 收集 lengthCollectors.toList())));

然后找出最大 key,对应的 List 就是所有最大值:

LongmaxCount=reversed.keySet().stream().max(Long::compare).orElseThrow();List<Integer>lengthsWithMaxCount=reversed.get(maxCount);System.out.println("最大数量 = "+maxCount+",对应长度 = "+lengthsWithMaxCount);

🖨 输出:

最大数量=3,对应长度=[3,4,5]

✅ 总结

操作目标推荐方法
构建直方图(统计数量)groupingBy(..., counting())
提取唯一最大值(value 最大)entrySet().stream().max(comparingByValue())
提取多个最大值(存在并列最大)Map 反转 +groupingBy+max(keySet())
提升可读性使用 Java 16+ 的record
http://www.jsqmd.com/news/358125/

相关文章:

  • 2026年分析先进AI照明解决方案,靠谱品牌排名出炉 - mypinpai
  • 2026年高端洗发水香韵与成分双榜:以调香艺术、奢配成分与感官体验定级 - 华Sir1
  • 探寻赛微思咨询的团队专业度高吗,上海地区企业如何选择 - mypinpai
  • 2026智推时代GEO商务对接手册:上海区域专属联系方式与合作流程 - 速递信息
  • 2026智推时代GEO对接联系方式汇总:上海总部直连与区域合作渠道速查 - 速递信息
  • 2026年潜水搅拌机好用品牌排名,蓝恒环保实力上榜 - 工业推荐榜
  • 聊聊深圳罗湖比较好的配眼镜公司,哪家口碑和性价比更高? - mypinpai
  • 2026最新!风靡全网的降AI率网站 —— 千笔·降AI率助手
  • 2026年双曲面搅拌机选购攻略,南京蓝恒环保等优质厂家分析 - 工业品牌热点
  • 分享雄县鸿德电气设备,交货期准时吗,听听客户真实反馈 - 工业品牌热点
  • 聊聊2026年瓷砖厂家选择,北京地区哪家口碑好 - myqiye
  • 聊聊石灰厂家的产品质量如何,专业生产厂推荐 - 工业推荐榜
  • 计算机毕设java邯郸学院健康驿站管理系统 基于SpringBoot的高校健康隔离管理平台设计与实现 校园防疫健康服务系统开发与应用研究
  • 选购活性炭吸附塔,技术强、售后好的厂家有哪些 - myqiye
  • 讲讲2026年复印机租赁专业制造商怎么选择更靠谱 - 工业品网
  • 讲讲全国耐用活性炭吸附塔品牌,江苏格菲普服务超贴心 - 工业设备
  • 反复敏感星人救星!2025 年 2 月修护面霜榜单,医研共创更安心 - 速递信息
  • 盘点2026香港有实力的室内装修品牌企业,靠谱之选别错过 - 工业品网
  • 计算机毕设Java基于Vue框架的烟酒销售管理系统 SpringBoot+Vue烟酒电商销售平台的设计与实现 基于Java Web的卷烟酒类商品在线销售系统开发
  • 敏感肌护肤品牌挑选指南:成分、功效与口碑的综合考量 - 速递信息
  • 喷淋塔设计生产厂哪家专业,好用的品牌有哪些? - 工业设备
  • 2026年广东、江西地区哪个品牌的安全阀检测台质量好 - mypinpai
  • 不踩雷AI论文写作软件 千笔·专业论文写作工具 VS PaperRed 本科生专属
  • 聊聊2026年湖南售后完善的AI智能体获客平台,哪家性价比高 - 工业品牌热点
  • 三菱PLC加显触摸屏定长送料程序开发探索
  • 论文写不动?人气爆表的一键生成论文工具 —— 千笔·专业论文写作工具
  • All-in-One 模式安装kubesphere
  • 项目实践:XinServer 的备份恢复机制非常好用
  • 探讨2026年伸缩悬臂货架,专业供应商推荐与价格分析 - 工业推荐榜
  • iptables 防火墙规则案例4:端口转发和负载均衡