news 2026/5/10 4:36:02

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/5/7 21:11:59

网页端大文件上传插件如何支持视频文件的秒传和断点续传?

首先右键单击网站根目录,在弹出的快捷菜单中,选择"添加引用"菜单项,弹出"添加引用",切换到"浏览"找到组件的Dll文件"Bestcomy.Web.Controls.Upload.dll"(本文件可到官网下载,本文后面也提供下载),单击"确定",回到VS工作界面…

作者头像 李华
网站建设 2026/5/8 14:35:39

Flowise惊艳案例:100+模板复用后的定制化成果分享

Flowise惊艳案例&#xff1a;100模板复用后的定制化成果分享 1. 为什么Flowise能让人眼前一亮&#xff1f; 你有没有过这样的经历&#xff1a;花了一周时间研究LangChain文档&#xff0c;写了几十行代码&#xff0c;结果RAG问答还是答非所问&#xff1f;或者好不容易调通一个…

作者头像 李华
网站建设 2026/5/1 17:01:23

OFA-large模型效果展示:真实电商SKU图文不一致问题识别案例

OFA-large模型效果展示&#xff1a;真实电商SKU图文不一致问题识别案例 1. 引言&#xff1a;电商平台的一个“小”麻烦 你有没有在网上买东西时遇到过这种情况&#xff1f;看商品图片觉得挺不错&#xff0c;收到实物后却发现“货不对板”。图片上是一件质感很好的毛衣&#x…

作者头像 李华
网站建设 2026/5/9 23:00:31

Clawdbot部署Qwen3-32B保姆级指南:Mac M2/M3芯片Ollama适配与网关配置

Clawdbot部署Qwen3-32B保姆级指南&#xff1a;Mac M2/M3芯片Ollama适配与网关配置 1. 为什么需要这套本地部署方案 你是不是也遇到过这些问题&#xff1a;想用Qwen3-32B这样强大的开源大模型&#xff0c;但又不想把敏感对话发到公有云&#xff1f;想在Mac上直接跑起来&#x…

作者头像 李华
网站建设 2026/5/3 5:27:54

如何利用jQuery实现大文件的分片上传和断点续传?

2023年X月X日 开发日志 - 大文件传输系统攻坚实录 凌晨1:30&#xff0c;合肥的暴雨敲打着窗户&#xff0c;我正在为这个极具挑战的外包项目设计技术方案。客户的需求相当硬核——基于WebUploader实现20G级文件夹传输&#xff0c;还要兼容IE8这个"上古神器"。泡了杯浓…

作者头像 李华
网站建设 2026/5/1 11:45:13

农业大数据平台如何处理Word表格的Web端编辑?

【开发日记&#xff1a;Word图片一键转存大作战——从“秃头警告”到“真香现场”】 2023年X月X日 周X 晴&#xff08;但我的头顶在下雨&#xff09; 第一章&#xff1a;需求诞生——甲方爸爸的“五彩斑斓黑” 今天导师突然发来一个“小需求”&#xff1a;给我的CMS系统后台新…

作者头像 李华