java 组装树形结构List

实现方式千千万,下面是本人实现的一种方式。

业务需求:
将一个内关联表中的数据,组装成树形结构。
业务表:使用parent_id关联父节点id,父级根节点的parent_id为0。

 树形结构:

[
  {
    "id": 1, 
    "parentId": 0, 
    "userName": "AA", 
    "children": [
      {
        "id": 11, 
        "parentId": 1, 
        "userName": "AA-AA", 
        "children": [
          {
            "id": 111, 
            "parentId": 11, 
            "userName": "AA-AA-AA", 
            "children": []
          }
        ]
      }
    ]
  },
  {
    "id": 2, 
    "parentId": 0, 
    "userName": "BB", 
    "children": [
      {
        "id": 22, 
        "parentId": 2, 
        "userName": "BB-BB", 
        "children": []
      }
    ]
  }
]

java代码:

UserTree实体类:

import java.util.List;

public class UserTree {
    private Integer id;
    private Integer parentId;
    private String userName;
    private List<UserTree> children;

    public UserTree(Integer id, Integer parentId, String userName) {
        this.id = id;
        this.parentId = parentId;
        this.userName = userName;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Integer getParentId() {
        return parentId;
    }

    public void setParentId(Integer parentId) {
        this.parentId = parentId;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public List<UserTree> getChildren() {
        return children;
    }

    public void setChildren(List<UserTree> children) {
        this.children = children;
    }

    @Override
    public String toString() {
        return "UserTree{" +
                "id=" + id +
                ", parentId=" + parentId +
                ", userName='" + userName + '\'' +
                ", children=" + children.toString() +
                '}';
    }
}

核心逻辑代码:

import java.util.ArrayList;
import java.util.List;

/**
 * 测试用户树形结构
 * @author 测试
 */
public class TestUserTree {
    public static void main(String[] args) {
        // 模拟从数据库表中查询出的 user数据list
        List<UserTree> userDataList = new ArrayList<>();
        userDataList.add(new UserTree(1, 0, "AA"));
        userDataList.add(new UserTree(11, 1, "AA-AA"));
        userDataList.add(new UserTree(111, 11, "AA-AA-AA"));
        userDataList.add(new UserTree(2, 0, "BB"));
        userDataList.add(new UserTree(22, 2, "BB-BB"));

        // 父级根节点 list
        List<UserTree> rootUserList = new ArrayList<>();
        // 从查询出的数据中 获取 所有父级根节点
        for (UserTree user : userDataList) {
            // parentId为0的是父级
            if (user.getParentId().equals(0)) {
                rootUserList.add(user);
            }
        }

        // 最终的树形结构list
        List<UserTree> userTreeList = new ArrayList<>();
        // 构建树形结构
        for (UserTree rootUser : rootUserList) {
            UserTree user = buildUserTree(userDataList, rootUser);
            userTreeList.add(user);
        }

        System.out.println(userTreeList);

    }

    /**
     * 递归构建树形结构
     * @param userDataList 所有的用户数据list
     * @param userTree 用户对象
     * @return
     */
    public static UserTree buildUserTree(List<UserTree> userDataList, UserTree userTree) {
        List<UserTree> childrenUserList = new ArrayList<>();
        for (UserTree user : userDataList) {
            // 当前数据的 parentId 等于 父节点的 id,则该数据是当前父级节点的子级。
            if (user.getParentId().equals(userTree.getId())) {
                // 递归调用
                childrenUserList.add(buildUserTree(userDataList, user));
            }
        }
        userTree.setChildren(childrenUserList);
        return userTree;
    }

}

最终打印出的就是上方提到的树形结构。

核心的思路就是,使用递归的方式逐级遍历所有的用户数据,找出每一层父级节点的子级,将子级节点保存为list赋值给父级的children字段。

注:转载请注明出处。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值