树形组织机构

关于树形列表的写法:

直观上,无限嵌套的list,可能涉及到迭代器、递归等使用

代码demo:

1.通过List集合组装树表结构
这个方法是用来通过相关条件查询出所有符合条件list集合 将对应的list集合组装成树表结构

//业务方法中直接调用的方法  Object换成自己实际对应的实体 也可以改成泛型 来通用使用
//beans指符合条件的查询到的list集合
//current指当前需要组装的树表结构的根节点,为什么需要指定根节点是因为这样我们可以动态的组装一个不定层级的动态树表而不是按照数据存储的根节点组装一个全量树
private static void getTreeFn(List<Object> beans, Object current) {
        List<Object> childsList = getChildList(beans, current);
        current.setChildren(childsList);
        for (ObjectnextChild : childsList) {
            getTreeFn(beans, nextChild);
        }
    }

2.查询指定节点下的子节点
这个方法是用来查询当前节点下的子节点,需要注意的是这里所说的子节点指的是下一层级的节点,不包含全量所有层级的子节点。

private static List<Object> getChildList(List<Object> beans, Object current) {
        List<Object> childsList = new ArrayList<Object>();
        Iterator<Object> it = beans.iterator();
        while (it.hasNext()) {
            Object child = it.next();
            if (current.getIdTemplate().equals(child.getTemplatePid())) {
                childsList.add(child);
            }
        }
        //这一步是用来对子表顺序排序的 若实际过程中没有排序字段或者没有相关业务要求 可以删除这一步的操作逻辑
        if(CollUtil.isNotEmpty(childsList)){
            childsList.sort(comparing(Object::getDataSort));
        }
        return childsList;
    }

3.查询指定节点的父节点一直到根节点
写这个方法的背景,我简单说一下 正常来说我们组装树表,都是知道某一节点,然后组装子节点,也就是使用上面的1和2两个方法 就能得到一个我们需要的树表,但是在我自己的实际业务中,我们通过已知的信息只能查到一个具体的节点,然后我们需要组装这个节点的所有子节点以及找到他的所有父级节点一直到数据逻辑上的根节点,然后得到一个从数据逻辑根节点开始的树表,由于这个需求,我写了一个查询父级节点的逻辑方法

每个节点理论上只有一个父节点(个人理解)

//我自己的数据逻辑根节点为pid=-1 大家可以按照自己的实际存储逻辑来调整
private static Object getParentRootNode(List<Object> beans, Object current) {
        if(ObjectUtil.isEmpty(current) || "-1".equals(current.getTemplatePid()) || CollUtil.isEmpty(beans)){
            return current;
        }
        Object parentNode = new Object();
        Boolean flag = false;
        Iterator<Object> it = beans.iterator();
        while (it.hasNext()) {
            parentNode = it.next();
            //若找到一个父节点则直接结束当前循环
            if (parentNode.getIdTemplate().equals(current.getTemplatePid())) {
                List<Object> childsList = new ArrayList<Object>();
                childsList.add(current);
                parentNode.setChildren(childsList);
                flag = true;
                break;
            }
        }
        if(flag){//有父节点 则循环查找
            return getParentRootNode(beans,parentNode);
        }else{//没有父节点了 则结束查询逻辑返回已组装的鼠标逻辑结构数据
            return current;
        }
    }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值