packagecom.protagonist.edu.utils;importcom.protagonist.edu.bo.SubjectTreeNodeBO;importcom.protagonist.edu.entity.Subject;importcom.protagonist.responseVO.StatusCode;importcom.protagonist.servicebase.exception.ProtagonistException;importorg.springframework.beans.BeanUtils;importorg.springframework.util.CollectionUtils;import java.util.*;/*** 用于构建树形结构*/
public classTreeUtil {/*** 默认树形菜单最顶层的pid是"0"
*@paramlist 所有数据
*@return树形的数据*/
public static List buildTree(Listlist) {if(CollectionUtils.isEmpty(list)){throw new ProtagonistException(StatusCode.ERROR,"查询的菜单数据为空,不能转为树形");
}return buildTree(list, "0");
}/*** 获取树形菜单结构
* 思路:首先遍历一次将所有的数据转化为前端需要的数据类型,然后放入到map中,以id->T对应关系
* 然后再遍历一次,这次的话判断parentId是否为0(这里暂时可以特使pid为0时表示一级菜单),是的话就是一级菜单,就放到rootTree中;
* 不为0的话,说明不是一级菜单,我们就需要获取它的父菜单
* 根据pid去map中获取,然后将当前菜单放入其父菜单的子菜单中,等遍历完之后树形菜单就ok了,这种做法可以完成多级子菜单变成树形
*@paramlist 所有的数据
*@parampid 父id
*@return树形数据*/
public static List buildTree(Listlist, String pid) {if(CollectionUtils.isEmpty(list)){throw new ProtagonistException(StatusCode.ERROR,"查询的菜单数据为空,不能转为树形");
}
List allTreeNode = new ArrayList<>();
List rootTree = new ArrayList<>();
Map nodeMap = new HashMap<>();//将所有的数据都放入到map中一份
for(Subject item : list) {
SubjectTreeNodeBO nodeBO= newSubjectTreeNodeBO();
BeanUtils.copyProperties(item,nodeBO);
allTreeNode.add(nodeBO);
nodeMap.put(item.getId(),nodeBO);
}for(SubjectTreeNodeBO t : allTreeNode) {//如果父id等于传进来的pid,那么该菜单是最顶级的菜单,放入到rootTree中
if(Objects.equals(t.getParentId(), pid)){
rootTree.add(t);//如果不是顶级菜单,那就获取父菜单,然后嫁给你本BO设置到父菜单的children中
}else{
SubjectTreeNodeBO parentNode=nodeMap.get(t.getParentId());
parentNode.getChildren().add(t);
}
}returnrootTree;
}
}