如何对Collectors.counting()统计的频率值执行除法与求和运算?
解决方案:计算整数频率除以2的和
给定列表:
List<Integer> myIntegers = Arrays.asList(1, 1, 2, 3, 4, 2);
需求是计算所有整数的「出现频率÷2」之和(整数除法,舍去小数),期望结果为2。
方式一:一次流操作完成(无需单独存Map)
不需要先单独生成频率Map,可以直接在流链中完成统计与求和:
int sum = myIntegers.stream() // 统计每个整数的出现次数 .collect(Collectors.groupingBy(Function.identity(), Collectors.counting())) // 取出所有频率值转为流 .values() .stream() // 对每个频率做整数除法,转成int类型 .mapToInt(count -> (int) (count / 2)) // 求和 .sum();
方式二:基于已有的频率Map处理
如果你已经通过以下代码拿到了频率Map:
Map<Integer, Long> myIntegerMap = myIntegers.stream() .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
直接对Map的频率值进行处理即可:
int sum = myIntegerMap.values() .stream() .mapToInt(count -> (int) (count / 2)) .sum();
说明
这里使用的是Java的整数除法,即/运算符对整数(或Long)运算时会自动舍去小数部分,完全符合需求中的计算逻辑:
- 1出现2次 → 2/2=1
- 2出现2次 → 2/2=1
- 3出现1次 → 1/2=0
- 4出现1次 → 1/2=0
总和为1+1+0+0=2,与期望输出一致。
内容的提问来源于stack exchange,提问作者Raoul Duke
相关产品推荐
相关产品推荐

