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

Java中如何将含子实体的List<Entity>转换为Map<String, Entity>

层级实体转Map的实现方案

问题背景

定义的Entity类如下:

public class Entity {
    private String id;
    private List<Entity> children;
    
    // getters, constructor, etc.
}

需要将输入的List<Entity>转换为Map<String, Entity>,要求Map中包含所有层级的实体,键为实体的id,值为对应的Entity对象。现有实现仅处理了顶层实体,不知道如何遍历子实体完成全层级的收集:

public static Map<String, Entity> group(List<Entity> entities) {
    
    Map<String, Entity> map = new HashMap<>();
    for (Entity e : entities) {
        if (!map.containsKey(e.getId())) {
            map.put(e.getId(), ??? e.getChildren() ???); // 此处困惑
        }
    }
    return map;
}

示例数据格式:

[
 {
    "id": "bos",
    "children":[
        {
            "id": "manager1",
            "children": [{"id": "worker11"}, {"id": "worker12"}]
        },
        {
            "id": "manager2",
            "children": [{"id": "worker21"}, {"id": "worker22"}]
        }
    ]
 }
]

实现方案

要覆盖所有层级的实体,需要通过递归遍历每个实体及其子实体,将所有实体逐一加入Map。具体实现如下:

import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class EntityUtils {

    public static Map<String, Entity> group(List<Entity> entities) {
        Map<String, Entity> entityMap = new HashMap<>();
        // 遍历顶层实体,逐个处理自身及子实体
        for (Entity entity : entities) {
            addAllLevels(entity, entityMap);
        }
        return entityMap;
    }

    // 递归方法:添加当前实体及其所有层级的子实体到Map
    private static void addAllLevels(Entity entity, Map<String, Entity> map) {
        // 将当前实体存入Map(若id重复,后续实体将覆盖之前的,可根据业务调整逻辑)
        map.put(entity.getId(), entity);
        
        // 处理子实体:若子列表不为空,递归遍历每个子实体
        List<Entity> children = entity.getChildren();
        if (children != null && !children.isEmpty()) {
            for (Entity child : children) {
                addAllLevels(child, map);
            }
        }
    }
}

说明

  1. 核心逻辑是递归:先将当前实体加入Map,再对每个子实体重复执行相同操作,确保所有层级的实体都被收集。
  2. 若存在重复id的实体,后续加入的实体会覆盖之前的。如果需要保留首次出现的实体,可以在map.put()前增加判断:if (!map.containsKey(entity.getId()))。
  3. 运行示例数据后,Map中将包含以下键值对:bos、manager1、worker11、worker12、manager2、worker21、worker22,对应所有层级的实体对象。

内容的提问来源于stack exchange,提问作者Balakirethiga R

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 23:35:22