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

📅 发布时间:2026/7/7 15:47:28 👁️ 浏览次数:
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()来完成CollectionStringstringsList.of(one,two,three,four,five,six,seven,eight,nine,ten,eleven,twelve);MapInteger,Longhistogramstrings.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.EntryInteger,LongmaxValuehistogram.entrySet().stream().max(Map.Entry.comparingByValue()).orElseThrow();System.out.println(maxValue maxValue); 输出maxValue34 小技巧entrySet().stream()是将 Map 转换为流。Map.Entry.comparingByValue()是基于值的比较器。orElseThrow()是保险措施避免空结果。⚠️ Part 3多个最大值时如何处理如果出现多个 key 拥有相同的最大 value那么上面方法只能选出一个其他会被忽略。例如CollectionStringstringsList.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 valueMapLong,ListIntegerreversedhistogram.entrySet().stream().collect(Collectors.groupingBy(Map.Entry::getValue,// 用 count 作为 keyCollectors.mapping(Map.Entry::getKey,// 收集 lengthCollectors.toList())));然后找出最大 key对应的 List 就是所有最大值LongmaxCountreversed.keySet().stream().max(Long::compare).orElseThrow();ListIntegerlengthsWithMaxCountreversed.get(maxCount);System.out.println(最大数量 maxCount对应长度 lengthsWithMaxCount); 输出最大数量3对应长度[3,4,5]✅ 总结操作目标推荐方法构建直方图统计数量groupingBy(..., counting())提取唯一最大值value 最大entrySet().stream().max(comparingByValue())提取多个最大值存在并列最大Map 反转 groupingBymax(keySet())提升可读性使用 Java 16 的record