递归获取组织下面的组织,tree

头痛的递归

两种方法

性能较差,但是理解简单

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;

    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值