Java构建多级树形菜单

项目要求需要用到树形菜单,直接通过查表构建。
附下表:
在这里插入图片描述

菜单用parent_id来进行分级。上代码

// 先查出所有的公共文件目录
List<ArchiveNetDisc> andList = archiveNetDiscMapper.findShareTree();
List<ArchiveNetDisc> archiveNetDiscList = buildDeptTree(andList);

findShareTree是查出所有的目录,省的频繁查库,没有做排序分级,buildDeptTree是分级操作。

public List<ArchiveNetDisc> buildDeptTree(List<ArchiveNetDisc> depts) {
        List<ArchiveNetDisc> deptList = new ArrayList<>();
        List<Long> deptIdList = new ArrayList<>();
        for (ArchiveNetDisc dept : depts) {
            deptIdList.add(dept.getId());
        }
        for (ArchiveNetDisc dept : depts) {
            // 如果是顶级节点,遍历该父节点所有子节点
            // if (!deptIdList.contains(dept.getParentId())) {
            if (ObjectUtil.isNull(dept.getParentId())) {
                recursionFn(depts, dept);
                deptList.add(dept);
            }
        }
        if (deptList.isEmpty()) {
            deptList = depts;
        }
        return deptList;
    }

因为我的最高目录的parent_id是null,所以这里用ObjectUtil.isNull()进行判断。recursionFn是递归列表 ,结束条件为所遍历的节点无下一级节点。

private void recursionFn(List<ArchiveNetDisc> list, ArchiveNetDisc dept) {
        // 得到子节点列表
        List<ArchiveNetDisc> childList = getChildList(list, dept);
        dept.setChildren(childList);
        for (ArchiveNetDisc tChild : childList) {
            // 如果子节点有下一级节点,得到下一级的节点列表
            if (hasChild(list, tChild)) {
                recursionFn(list, tChild);
            }
        }
    }

getChildList是获得该节点的下一级子节点列表。hasChild是判断是否有子节点,也就是重新走了一遍getChildList。

private List<ArchiveNetDisc> getChildList(List<ArchiveNetDisc> list, ArchiveNetDisc dept) {
        List<ArchiveNetDisc> deptList = new ArrayList<>();
        for (ArchiveNetDisc d : list) {
            // 遍历非顶级节点,并获得传入参数顶级节点的下一级子节点列表
            if (d.getParentId() != null && d.getParentId() == dept.getId().longValue()) {
                deptList.add(d);
            }
        }
        return deptList;
    }
private boolean hasChild(List<ArchiveNetDisc> list, ArchiveNetDisc dept) {
        return getChildList(list, dept).size() > 0;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值