news 2026/3/31 5:27:24

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/26 22:56:12

GitHub 热榜项目 - 日榜(2026-02-08)

GitHub 热榜项目 - 日榜(2026-02-08) 生成于&#xff1a;2026-02-08 统计摘要 共发现热门项目&#xff1a; 12 个 榜单类型&#xff1a;日榜 本期热点趋势总结 本期GitHub热榜凸显AI驱动的实用开发工具成为核心趋势&#xff0c;开源社区正聚焦于提升开发效率与软件安全。O…

作者头像 李华
网站建设 2026/3/30 14:01:54

信创办公套件如何实现Word批注的完整Web转存?

企业级CMS编辑器增强功能实施方案 一、项目概述 作为安徽集团上市公司项目负责人&#xff0c;针对企业网站后台管理系统编辑器功能增强需求&#xff0c;我司计划开发一套支持多格式文档导入、微信公众号内容抓取的编辑器插件系统。该系统需满足党政事业单位信创要求&#xff…

作者头像 李华
网站建设 2026/3/22 7:49:17

学长亲荐!更贴合研究生需求的AI论文网站,千笔写作工具 VS 学术猹

随着人工智能技术的迅猛发展&#xff0c;AI辅助写作工具已逐渐成为高校学生完成论文写作的重要帮手。尤其是在研究生阶段&#xff0c;面对繁重的学术任务和严格的论文要求&#xff0c;越来越多的学生开始借助AI工具提升写作效率、优化内容质量。然而&#xff0c;市场上AI写作工…

作者头像 李华
网站建设 2026/3/27 0:20:05

2026别错过!9个AI论文网站测评:自考毕业论文+开题报告高效写作指南

随着2026年自考毕业论文写作季的临近&#xff0c;越来越多考生开始关注如何高效完成开题报告与论文撰写。面对内容构思困难、格式规范复杂、查重压力大等挑战&#xff0c;一款合适的AI写作工具成为提升效率的关键。为此&#xff0c;笔者基于真实用户使用体验与功能实测数据&…

作者头像 李华
网站建设 2026/3/27 1:38:51

计算机毕业设计springboot财务管理系统 基于SpringBoot框架的企业财务信息化平台构建与实现 基于Java的企业资金流转与账务核算智能管理系统

计算机毕业设计springboot财务管理系统8zhz7s19 &#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。在当今数字化转型浪潮下&#xff0c;企业财务管理正经历从传统手工记账向智能化、…

作者头像 李华
网站建设 2026/3/31 5:08:13

2026-02-08 GitHub 热点项目精选

&#x1f31f; 2026-02-08 GitHub Python 热点项目精选(13个) 每日同步 GitHub Trending 趋势&#xff0c;筛选优质 Python 项目&#xff0c;助力开发者快速把握技术风向标&#xff5e; &#x1f4cb; 项目列表&#xff08;按 Star 数排序&#xff09; 1. openai/skills OpenA…

作者头像 李华