You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java如何将对象对列表按元素出现次数分组生成对应Map映射

实现思路

要得到<出现次数, 对应Obj列表>的Map,需要分两步处理:

  1. 先拆分所有Pair中的Obj对象,统计每个Obj的出现频次
  2. 再将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 10:27:03