首先代码以后可以优化成stream流,但是为了方便可读性暂时不用 (可自行优化)
public void testTree() {
List<AppFolder> all = appFolderMapper.selectAll();
List<AppFolderVo> voList = new ArrayList<>();
for (AppFolder appFolder : all) {
AppFolderVo vo = new AppFolderVo();
BeanUtil.copyProperties(appFolder,vo);
voList.add(vo);
}
buildeDepetTree(voList);
}
private List<AppFolderVo> buildeDepetTree(List<AppFolderVo> depts){
//存放构建好的部门树
ArrayList<AppFolderVo> deptTrees = new ArrayList<>();
//存放顶级父部门
ArrayList<AppFolderVo> parents = new ArrayList<>();
//先寻找顶级父部门 可以优化成stream流的写法
for (AppFolderVo dept : depts) {
AppFolderVo vo = buildeParent(dept, depts);
if (!parents.contains(vo)){
parents.add(vo);
}
}
//寻找孩子
for (AppFolderVo parent : parents) {
AppFolderVo appFolderVo = buildTree(parent, depts);
deptTrees.add(appFolderVo);
}
return deptTrees;
}
private AppFolderVo buildTree(AppFolderVo parent, List<AppFolderVo> depts) {
ArrayList<AppFolderVo> childrens = new ArrayList<>();
for (AppFolderVo vo : depts) {
if (parent.getId().equals(vo.getParentId())){
childrens.add(buildTree(vo,depts));
}
}
parent.setChildrenFolders(childrens);
return parent;
}
//
private AppFolderVo buildeParent(AppFolderVo dept, List<AppFolderVo> depts) {
AppFolderVo parent = dept;
for (AppFolderVo folderVo : depts) {
if (dept.getParentId().equals(folderVo.getId())){
parent = buildeParent(folderVo,depts);
}
}
return parent;
}