前言:
项目中有一个部门树的展示需求,组装树结构这个业务场景十分常见,相信每一个从事 Java 开发的同行几乎都遇到过,本篇简单分享一下树结构的组装。
树结构数据模型
数据模型示例如下:
@Data
public class DepartmentPersonnelTreeVO {
@ApiModelProperty("部门名称")
private String deptName;
@ApiModelProperty("部门ID")
private String deptId;
@ApiModelProperty("父级部门ID")
private String parentId;
@ApiModelProperty("子部门节点")
private List<DepartmentPersonnelTreeVO> children = new ArrayList<>();
}
树结构数据模型分析
树结构一般有三个必备字段,如下:
- deptId:示例中描述为部门 id,这是树结构的一个必备字段,一般是当前节点 id,同时也是当前节点的子节点的 parentId。
- parentId:示例中描述为父级部门 id,很好理解也是树结构中的一个必备字段,构造父子关系使用。
- children:示例中描述为子部门节点,通用的说发就是当前节点的子节点,也是一个必备字段。
树结构组装,其实就是从数据库取出一组数据,去找到他们之间的父子关系,通畅都会需要遍历处理,以下我们分享递归、双层 for 循环、map 遍历构建树结构。
递归
递归就是从顶级节点一直往下查询,期间需要不停地查询数据库,不推荐递归来组装树结构,这里也就不做演示了。
双层 for 循环
外层每循环一次,就需要内层循环全部数据,去跟外层对比,是否有外层当前循环到的节点的子节点,代码如下:
rivate List<DepartmentPersonnelTreeVO> forBuildTree(List<DepartmentPersonnelTreeVO> departmentPersonnelList) {
// 结果集
List<DepartmentPersonnelTreeVO> departmentPersonnelTree = new ArrayList<>();
for (DepartmentPersonnelTreeVO departmentPersonnelTreeVO : departmentPersonnelL