树结构示例

第一种
public ApiResult getXGrBasZonationScheme(String projectId) {
    QueryWrapper<XGrBasZonationScheme> queryWrapper = new QueryWrapper<>();
    queryWrapper.eq("activity_id", projectId);
    List<XGrBasZonationScheme> list = xGrBasZonationSchemeMapper.selectList(queryWrapper);
    List<XGrBasZonationScheme> resultList = new ArrayList<>();
    for (XGrBasZonationScheme result : list) {
        if (ObjectUtils.isEmpty(result.getParentZoneId())) {
            //调用方法给子类添加数据
            resultList.add(getMenuTree(result, list));
        }
    }

    return ApiResult.ofSuccessResult(resultList);
}

private XGrBasZonationScheme getMenuTree(XGrBasZonationScheme result, List<XGrBasZonationScheme> list) {
    for (XGrBasZonationScheme xGrBasZonationScheme : list) {
        //如果父类主键等于传过来实体类的ID
        if (result.getZoneId().equals(xGrBasZonationScheme.getParentZoneId())) {
            if (result.getChildren() == null) {
                result.setChildren(new ArrayList<>());
            }
            // 递归调用
            result.getChildren().add(getMenuTree(xGrBasZonationScheme, list));
        }
    }
    return result;
}

第二种,更好用

/**
     * @param parentMenu获取所有顶级菜单
     */
for (Menu menu : parentMenu) {
                this.setChildren(menu, menus);
            }
            sorted(parentMenu);




/**
     * 从所有节点列表中查找并设置parent的所有子节点
     *
     * @param parent 父节点
     * @param nodes  所有树节点列表
     */
    private void setChildren(Menu parent, List<Menu> nodes) {
        List<Menu> children = Lists.newArrayList();
        Object parentId = parent.getId();

        for (Iterator<Menu> iterator = nodes.iterator(); iterator.hasNext(); ) {
            Menu node = iterator.next();
            if (Objects.equals(node.getParentCode(), parentId)) {
                children.add(node);
                //从所有节点列表中删除该节点,以免后续重复遍历该节点
                iterator.remove();
            }
        }
        //如果孩子为空,则直接返回,否则继续遍历递归设置孩子的孩子
        if (children.isEmpty()) {
            return;
        }
        parent.setChildren(children);
        children.forEach(e -> setChildren(e, nodes));
    }


/**
     * 给树结构排序
     *
     * @param parentMenu所有树节点列表
     */
private void sorted(List<Menu> parentMenu) {
        for (Menu menu : parentMenu) {
            if (CollectionUtils.isNotEmpty(menu.getChildren())) {
                List<Menu> collect = menu.getChildren().stream()
                        .sorted(Comparator.comparing(Menu::getShoworder)
                                .thenComparing(Menu::getCreateTime, Comparator.reverseOrder())).collect(Collectors.toList());
                sorted(collect);
                menu.setChildren(collect);
            }
        }
    }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值