Java如何将对象对列表按元素出现次数分组生成对应Map映射
实现思路
要得到<出现次数, 对应Obj列表>的Map,需要分两步处理:
- 先拆分所有Pair中的Obj对象,统计每个Obj的出现频次
- 再将Obj按照统计得到的频次分组,得到目标结构
完整实现代码
import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.function.Function; import java.util.stream.Collectors; // 注意如果你的Pair不是javafx包的,替换为对应包的导入 import javafx.util.Pair; public Map<Integer, ArrayList<Obj>> numBorders(List<Pair<Obj,Obj>> lf) { List<Obj> allObjs = new ArrayList<>(); // 拆分所有Pair的key和value到统一列表 for(Pair<Obj, Obj> pair : lf) { allObjs.add(pair.getKey()); allObjs.add(pair.getValue()); } // 第一步:统计每个Obj的出现次数 Map<Obj, Long> objCountMap = allObjs.stream() .collect(Collectors.groupingBy( Function.identity(), Collectors.counting() )); // 第二步:按出现次数分组,得到目标Map return objCountMap.entrySet().stream() .collect(Collectors.groupingBy( entry -> entry.getValue().intValue(), Collectors.mapping( Map.Entry::getKey, Collectors.toCollection(ArrayList::new) ) )); }
注意事项
Obj类必须正确重写equals()和hashCode()方法,否则对象匹配逻辑会失效,导致统计结果错误- 如果你不需要严格返回
ArrayList类型,也可以把方法返回值的泛型改成Map<Integer, List<Obj>>,收集时直接用Collectors.toList()即可,写法更简洁 - 你给出的示例输入运行上述代码得到的结果和预期输出完全匹配
内容的提问来源于stack exchange,提问作者james
相关产品推荐
相关产品推荐

