【JAVA】List<Object>类型构建树结构数据

前言

JAVA构建树形结构数据案例。

树形实体类

代码如下(示例):
get() || set() 方法就省略了,此处用lombok@Data注解代替

@Data
public class TreeBean {
    /**
     * id
     */
    private String id;
    /**
     * 名称
     */
    private String name;
    /**
     * 上级id
     */
    private String parentId;
    /**
     * 子集 集合
     */
    private List<TreeBean> children;

    /**
     * 无参构造
     */
    public TreeBean() {
    }

    /**
     * 自定义构造方法,省略子集变量
     * @param id
     * @param name
     * @param parentId
     */
    public TreeBean(String id, String name, String parentId) {
        this.id = id;
        this.name = name;
        this.parentId = parentId;
    }
}

lombok依赖坐标如下:

 <dependency>
     <groupId>org.projectlombok</groupId>
     <artifactId>lombok</artifactId>
     <version>1.18.18</version>
 </dependency>

数据构造示例

模拟数据

代码如下(示例):

@GetMapping("childrenTest")
    @ApiOperation(value = "树型结构数据测试接口",notes = "树型结构数据测试接口")
    public ResponseEntity<List<TreeBean>> childrenTest(){
    	// 造假数据,真实环境下通过数据库查询。
    	// new TreeBean("id","名称","父级id")
        List<TreeBean> list = new ArrayList<>();
        list.add(new TreeBean("001","中国","0"));
        list.add(new TreeBean("002","美国","0"));
        list.add(new TreeBean("003","俄罗斯","0"));
        list.add(new TreeBean("1","北京","001"));
        list.add(new TreeBean("2","天津","001"));
        list.add(new TreeBean("3","东城区","1"));
        list.add(new TreeBean("4","西城区","1"));
        list.add(new TreeBean("5","朝阳区","1"));
        list.add(new TreeBean("6","和平区","2"));
        list.add(new TreeBean("7","旧金山","002"));
        list.add(new TreeBean("8","圣彼得堡","002"));
        //调用构建树结构数据方法
        List<TreeBean> children = getChildren(list, "0");
        return ResponseEntity.ok(children);
    }

递归构造数据

代码如下(示例):

/**
 *构建树形结构数据
 * @param beanList:数据集合
 * @param parentId:父级标识(初始因该为最顶级的标识)
 * @return
 */
public static List<TreeBean> getChildren(List<TreeBean> beanList,String parentId){
    //创建返回树结构数据集合
    List<TreeBean> treeList = new ArrayList<>();
    for (TreeBean bean : beanList) {
        //创建当前节点的bean
        TreeBean treeBean = new TreeBean();
        //创建当前节点下子节点的数据集合
        List<TreeBean> childrenList = new ArrayList<>();
        //如果当前节点等于【参数】父节点,则进行递归操作
        if (parentId.equals(bean.getParentId())){
            //将节点数据复制到当前bean下,也就是上面创建的【treeBean对象】
            BeanUtils.copyProperties(bean,treeBean);
            //递归查询当前节点是否有子节点
            childrenList = getChildren(beanList,bean.getId());
            //有则将子节点的数据集合添加到当前bean下
            if (childrenList.size()>0){
                treeBean.setChildren(childrenList);
            }
            //将当前构建的树对象放入返回集合中
            treeList.add(treeBean);
        }
    }
    return treeList;
}

测试案例

[
  {
    "id": "001",
    "name": "中国",
    "parentId": "0",
    "children": [
      {
        "id": "1",
        "name": "北京",
        "parentId": "001",
        "children": [
          {
            "id": "3",
            "name": "东城区",
            "parentId": "1",
            "children": null
          },
          {
            "id": "4",
            "name": "西城区",
            "parentId": "1",
            "children": null
          },
          {
            "id": "5",
            "name": "朝阳区",
            "parentId": "1",
            "children": null
          }
        ]
      },
      {
        "id": "2",
        "name": "天津",
        "parentId": "001",
        "children": [
          {
            "id": "6",
            "name": "和平区",
            "parentId": "2",
            "children": null
          }
        ]
      }
    ]
  },
  {
    "id": "002",
    "name": "美国",
    "parentId": "0",
    "children": [
      {
        "id": "7",
        "name": "旧金山",
        "parentId": "002",
        "children": null
      },
      {
        "id": "8",
        "name": "圣彼得堡",
        "parentId": "002",
        "children": null
      }
    ]
  },
  {
    "id": "003",
    "name": "俄罗斯",
    "parentId": "0",
    "children": null
  }
]

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
你可以使用递归来生成树形结构,而不使用嵌套的循环。下面是一个示例代码: ```java import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class TreeGenerator { public static List<Map<String, Object>> generateTree(List<Map<String, Object>> flatList, String parentIdKey, String idKey) { List<Map<String, Object>> treeList = new ArrayList<>(); Map<Object, List<Map<String, Object>>> childMap = new HashMap<>(); // 将所有节点按照父节点分组 for (Map<String, Object> node : flatList) { Object parentId = node.get(parentIdKey); childMap.computeIfAbsent(parentId, k -> new ArrayList<>()).add(node); } // 递归生成树形结构 generateChildren(childMap, treeList, null, idKey); return treeList; } private static void generateChildren(Map<Object, List<Map<String, Object>>> childMap, List<Map<String, Object>> parentList, Object parentId, String idKey) { List<Map<String, Object>> children = childMap.get(parentId); if (children != null) { for (Map<String, Object> child : children) { Object childId = child.get(idKey); List<Map<String, Object>> grandChildren = new ArrayList<>(); child.put("children", grandChildren); generateChildren(childMap, grandChildren, childId, idKey); } parentList.addAll(children); } } public static void main(String[] args) { // 示例用法 List<Map<String, Object>> flatList = new ArrayList<>(); Map<String, Object> node1 = new HashMap<>(); node1.put("id", 1); node1.put("parentId", null); flatList.add(node1); Map<String, Object> node2 = new HashMap<>(); node2.put("id", 2); node2.put("parentId", 1); flatList.add(node2); Map<String, Object> node3 = new HashMap<>(); node3.put("id", 3); node3.put("parentId", 1); flatList.add(node3); Map<String, Object> node4 = new HashMap<>(); node4.put("id", 4); node4.put("parentId", 2); flatList.add(node4); List<Map<String, Object>> treeList = generateTree(flatList, "parentId", "id"); System.out.println(treeList); } } ``` 这个示例代码中,`generateTree` 方法接受一个扁平的节点列表 `flatList`,以及两个键的名称:`parentIdKey` 和 `idKey`。它首先将节点按照父节点进行分组,然后通过递归调用 `generateChildren` 方法来构建树形结构。最后返回生成的树形结构列表。 你可以根据自己的数据结构和需求进行相应的修改。希望这能帮到你!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值