树结构优解

119 阅读1分钟

简介

树结构是一种包含自己的类,通过将自己用children[]包裹起来,在数据库中一般通过id和pid联动,形成树结构。

步骤指导

  1. 完成类的搭建,即为树结构搭建
  2. 完成工具类的书写,利用HashMap而不使用递归
  3. 引用工具类,实现树结构的json发送

案例演示

树结构搭建

@Data
@JsonInclude(JsonInclude.Include.NON_NULL) //空值不传递
public class SysAppMenuTree {
    private Integer id;
    private Integer pid;
    private Integer menuType;
    private String name; // 新添加的 name 字段
    private List<SysAppMenuTree> children;
    public void addChild(SysAppMenuTree node) {
        if (node != null) {
            if (children == null) {
                children = new ArrayList<>();
            }
            children.add(node);
        }
    }
}

工具类的书写

public List<SysAppMenuTree> buildTrees(List<SysAppMenuTree> nodes) {

    Map<Integer, SysAppMenuTree> map = new HashMap<>();

    // 将所有节点放入 map,key 是节点的 id
    for (SysAppMenuTree node : nodes) {
        map.put(node.getId(), node);
    }

    List<SysAppMenuTree> roots = new ArrayList<>();

    // 构建树结构
    for (SysAppMenuTree node : nodes) {
        if (node.getPid() == 0) {
            roots.add(node);
        } else {
            SysAppMenuTree parent = map.get(node.getPid());
            if (parent != null) {
                parent.addChild(node);
            }
        }
    }
    return roots;
}

实现树结构的json发送

@Override
public List<SysAppMenuTree> findAllPermissionTree() {
    List<SysAppMenuTree> sysAppMenuTrees = appPermissionSettingsMapper.findAllPermissionTree();
    return buildTrees(sysAppMenuTrees);
}

说明

通过mapper查询出指定的SysAppMenuTree列表,需要查出什么数据或是需要什么数据,就加什么属性,此案例多查出了name字段,并且menuType当条件。

发送json格式如下:

{
    "id":"",
    "name":"",
    "pid":"",
    "children":[
        {
            "id":"",
            "name":"",
            "pid":""
        }
    ]
}