根据叶子节点生成树结构

获取满足条件的叶子节点,针对这些节点生成一颗非完整的树,减少展示非必要的树结构

步骤:

1.递归查询数据库,获取满足条件叶子节点的完整树分支(需要去重)

with recursive tree as (
    select t1.* from t1 inner join t2 on 关联条件
    where 满足条件的叶子节点
    union all
    select t3.* from t3 inner join tree t4 on 关联条件
)
select distinct * from tree

2.查数据库获取所有满足条件的叶子节点

select * from t1 inner join t2 on 关联条件
where 满足条件的叶子节点

3.java代码中生成非完整的树结构

List<TreeCatalog> treeNodeList = treeNode.stream().filter(
        node -> {
            // 获取所有顶层选项,过滤出根节点
            return Boolean.TRUE;
        }
).map((menu) -> {
    // 给叶子节点
    menu.setChildren(getChildren(menu, treeNode));
    return menu;
}).sorted(排序规则).collect(Collectors.toList());

递归获取叶子节点

private static List<TreeCatalog> getChildren(TreeCatalog treeCatalog, List<TreeCatalog> treeCatalogs){
    List<TreeCatalog> optionsList = treeCatalogs.stream()
            .filter(o -> o.getParentId().equals(treeCatalog.getId()))
            .map((child) -> {
                child.setChildren(getChildren(child, treeCatalogs));
                return child;
            }).sorted(Comparator.comparing(排序规则).collect(Collectors.toList());
    return optionsList;
}

4.将叶子节点设置到树中

private static void createChildren(TreeCatalog root, List<TreeCatalog> params){
    if(null != root.getChildren() && !root.getChildren().isEmpty()){
        for(TreeCatalog treeCatalog : root.getChildren()){
            createChildren(treeCatalog, params);
        }
    }
    Object id = root.getId();
    List<TreeCatalog> listTemp = params.stream().filter(x -> x.getId().equals(id)).collect(Collectors.toList());
    if(!listTemp.isEmpty()){
        root.getChildren().addAll(listTemp);
    }
}

完成。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值