获取分类下的所有子类拼装子孙树 (递归与非递归方法)

2 篇文章 0 订阅

需求:求某一分类下的所有子孙分类,以树的结果集返回

表结构:包含父类ID,父类路径,层级数

非递归方法思路:一次性将所有子孙的结果捞出,通过排序的方式(按层级数)排序,通过遍历整个结果集以map形式拼装结果

递归思路:查找子分类,如果子分类结果集不为空,记录当前分类数据,重复上述

非递归关键代码:(YY哥的代码)

public  List<BaikeClassEntity> tranformTree(List<BaikeClassEntity> originalList) {
        // 根据parentlevel 升序排序
        Collections.sort(originalList);

        List<BaikeClassEntity> list = new ArrayList<>();
        HashMap<Integer,BaikeClassEntity> map = new HashMap<>();
        for (BaikeClassEntity baiKeClass: originalList) {
            BaikeClassEntity parent = map.get(baiKeClass.getParentid());
            if (parent == null) {
                list.add(baiKeClass);
            } else  {
                parent.getChildrens().add(baiKeClass);
            }
            map.put(baiKeClass.getId(),baiKeClass);
        }
        return list;
    }

实体类

public class BaikeClassEntity implements Serializable, Comparable<BaikeClassEntity> {

    private static final long serialVersionUID = 1L;

    数据库字段

    @Transient
    @TableField(exist = false)
    private List<BaikeClassEntity> childrens = new ArrayList<>();

    @Override
    // 根据parentlevels 排序
    public int compareTo(BaikeClassEntity o) {
        return this.parentlevels - o.parentlevels;
    }
}

递归代码:

 public List<Tree> test(Integer id){
        List<Tree> tree =new ArrayList<>();
        List<BaikeClassEntity> list =classService.list(new QueryWrapper<BaikeClassEntity>().eq("ParentID",id)
                .eq("MarkStatus",0));
        if(list!=null && !list.isEmpty()){
            for(BaikeClassEntity entity:list){
                Tree t =new Tree();
                t.setId(entity.getId());
                t.setTitle(entity.getTitle());
                t.setChild(test(entity.getId()));
                tree.add(t);
            }
        }
        return tree;
    }

实体:

public class Tree implements Serializable {
    private static final long serialVersionUID = 1L;
    private Integer id;
    private String title;
    private List<Tree> child;
}

总结:递归方法虽然简便,但是由于递归时多次查询数据库,查询产生的耗时和查找次数成比例,所以不适合这种情况,非递归的方法由于只有一次查询,数据量偏小,耗时也相比递归方法少很多

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值