首先说一下,写这篇文章的背景。最近在实际开发工程中,碰到了好几处需要树表结构的数据展示,然后就仔细研究了一下,写了一些树表相关的操作逻辑处理。

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的方法来一起使用

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;
        }
    }

目前主要使用到的就是这几个方法,还写了几个方法,等梳理好了 在给大家贴上来。大家点赞收藏走一波,有什么好的建议也可以都写在评论区,我们一起探讨,谢谢大家阅览!