Java中如何对分组后的列表执行投影并求和?
Java实现分组后计算数对数量求和的方案
嘿,刚好能帮你解决这个问题!先纠正个小细节:你写的Collerctors拼写错啦,正确的是Collectors,这个要注意不然编译会报错哦。
接下来咱们一步步来实现你要的功能,其实和C#的思路很像,只是Java的Stream API写法略有不同,这里给你两种常用的实现方式:
方式一:先分组再计算求和
先按你原来的思路把元素分组,再遍历每个分组计算可组成的数对数量(组大小整除2),最后求和:
import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class GroupSumExample { public static void main(String[] args) { List<Integer> input = Arrays.asList(1, 2, 1, 1, 2, 3); // 先按元素值分组 Map<Integer, List<Integer>> groups = input.stream() .collect(Collectors.groupingBy(x -> x)); // 计算每个组的数对数量并求和 int result = groups.entrySet().stream() .mapToInt(entry -> entry.getValue().size() / 2) .sum(); System.out.println(result); // 输出:2(1组有3个→1对,2组有2个→1对,3组1个→0对,总和1+1+0=2) } }
方式二:更高效的直接统计计数求和
如果不需要保留分组后的元素列表,只需要统计出现次数的话,可以直接用Collectors.counting()统计每个元素的出现次数,再计算数对数量求和,这样内存效率更高:
import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class GroupSumExample { public static void main(String[] args) { List<Integer> input = Arrays.asList(1, 2, 1, 1, 2, 3); int result = input.stream() // 分组并统计每个元素的出现次数 .collect(Collectors.groupingBy( x -> x, Collectors.counting() )) .values() .stream() // 每个次数整除2得到数对数量,再求和 .mapToLong(count -> count / 2) .sum() .intValue(); System.out.println(result); // 同样输出2 } }
对比你给出的C#代码var result = groups.Select(x => x.ToList().Count / 2).Sum();,Java里的groups.entrySet().stream().mapToInt(entry -> entry.getValue().size() / 2).sum()就是对应的实现逻辑,核心都是遍历每个分组,取大小整除2后累加。
内容的提问来源于stack exchange,提问作者MakePeaceGreatAgain
相关产品推荐
相关产品推荐

