有时候我们从数据库中读取出了一个表的数据,比如存储的是中国的省市县的ID、名称与父节点ID,读出来的数据并不是前台想要的(当然现在好多tree库可以使用,不要拆台,最起码不好看是吧==),这个时候我们要想法处理一下都出来的list,将它变为一个树。
比如直接查出来是左边的数据,我们要的效果是右边的数据
新建实体类:
public class SysDept {
private Long id;
private String name;
private Long parentId;
private Integer orderNum;
private Byte delFlag;
private List<SysDept> children;
// 非数据库字段
private String parentName;
// 非数据库字段
private Integer level;
.....Getter/Setter
}
实现层:
public List<SysDept> findTree() {
List<SysDept> sysDepts = new ArrayList<>();
List<SysDept> depts = sysDeptMapper.findAll();
for (SysDept dept : depts) {
if (dept.getParentId() == null || dept.getParentId() == 0) {
dept.setLevel(0);
sysDepts.add(dept);
}
}
findChildren(sysDepts, depts);
return sysDepts;
}
private void findChildren(List<SysDept> sysDepts, List<SysDept> depts) {
for (SysDept sysDept : sysDepts) {
List<SysDept> children = new ArrayList<>();
for (SysDept dept : depts) {
if (sysDept.getId() != null && sysDept.getId().equals(dept.getParentId())) {
dept.setParentName(dept.getName());
dept.setLevel(sysDept.getLevel() + 1);
children.add(dept);
}
}
sysDept.setChildren(children);
findChildren(children, depts);
}
}
这边是用递归实现的,其他方法请参考:点击这里