头痛的递归
两种方法
性能较差,但是理解简单
tree实体
public class Tree implements Serializable {
private static final long serialVersionUID = -3349794575298238272L;
private Long id;
private Long pid;
private String text;
@JsonSerialize
private String state = "open";
private boolean checked = false;
private String iconCls;
private String openMode;
private Object attributes;
private String label;
private List<Tree> children;
private boolean leaf;
private int sort;
在这里插入代码片
@Override
@Deprecated
/**
* 递归调用,io重复操作,性能太差
*
* @date 2023/08/15 23:59
* @param parentId
* @return java.util.List<com.sl.egs.common.result.Tree>
*/
public List<Tree> findChild(Long parentId) {
// 通过父级id 查询元素
LambdaQueryWrapper<OutOrgOrganization> wrapper = new LambdaQueryWrapper<>();
wrapper
.eq(OutOrgOrganization::getOrgStatus, StateEnums.YES.getValue())
.eq(OutOrgOrganization::getOrgParentOrgId, parentId)
.orderByAsc(OutOrgOrganization::getOrgOrderCode);
List<OutOrgOrganization> list = baseMapper.selectList(wrapper);
// 创建一个 tree list
List<Tree> trees = Lists.newArrayList();
for (int i = 0; i < list.size(); i++) {
// 创建tree
Tree tree = new Tree();
// 一级tree
if (parentId == 0) {
tree.setId((long) i);
// 不可展开
tree.setOpenMode(StateEnums.NO.getValue().toString());
// 其他 tree
}else{
tree.setId(list.get(i).getOrgId());
// 可展开
tree.setOpenMode(StateEnums.YES.getValue().toString());
}
// 标签名
tree.setLabel(list.get(i).getOrgName());
// 设置父级id
tree.setPid(parentId);
// 设置children 节点
tree.setChildren(findChild(list.get(i).getOrgId()));
trees.add(tree);
}
return trees;
}
性能较好,但是不好理解
@Override
public List<Tree> getOrgTree() {
Long topParentId = 0L;
return createTree(topParentId);
}
/**
* 通过顶级id来创建一个树数据
* @date 2023/08/15 23:22
* @param parentId 顶级树id
* @return java.util.List<com.sl.egs.common.result.Tree>
*
*/
private List<Tree> createTree(Long parentId){
// 先遍历找到所有的符合条件的组织信息
LambdaQueryWrapper<OutOrgOrganization> wrapper = new LambdaQueryWrapper<>();
wrapper
.eq(OutOrgOrganization::getOrgStatus, StateEnums.NO.getValue())
.orderByAsc(OutOrgOrganization::getOrgOrderCode);
List<OutOrgOrganization> allList = baseMapper.selectList(wrapper);
// 初始化一个 tree
List<Tree> trees =Lists.newArrayList();
//遍历满足条件的组织信息
for (OutOrgOrganization org : allList) {
// 如果是一级节点,从一级节点开始添加tree parentId = 0,找到每一个一级节点
if(org.getOrgParentOrgId().equals(parentId)){
// 调用方法给trees 添加元素
trees.add(getNodeTree(org,allList));
}
}
return trees;
}
/**
* 递归调用方法
* @date 2023/08/15 23:23
* @param org 每一级组织数据
* @param allList 所有的组织数据
* @return com.sl.egs.common.result.Tree
*/
private Tree getNodeTree(OutOrgOrganization org,List<OutOrgOrganization> allList){
// 创建一个父节点
Tree tree = new Tree();
// 树的id
// 如果是一级节点
tree.setId(org.getOrgId());
// 树的父节点
tree.setPid(org.getOrgParentOrgId());
// 树的签名
tree.setLabel(org.getOrgName());
// 树的开闭
tree.setOpenMode(StateEnums.YES.getValue().toString());
// 遍历所有的组织数据,看当前组织是否有子树
for (OutOrgOrganization outOrg : allList) {
// 如果所有的组织信息中,有父级为org的 id,表示这个组织下面有子组织,也就是说 tree 有子树
if(outOrg.getOrgParentOrgId().equals(org.getOrgId())){
// 如果当前树的子树为空就实例化子树
if(CollUtil.isEmpty(tree.getChildren())){
List<Tree> childrenTree = Lists.newArrayList();
tree.setChildren(childrenTree);
}
// 然后向树里面填充子树,子树如果还有子树继续填充==> 递归填充
tree.getChildren().add(getNodeTree(outOrg,allList));
}
}
// 如果当前组织不存在子树,返回这个树节点
return tree;
}