如何递归查询父类以及子类结构树

简介: 如何递归查询父类以及子类结构树

一、结构树查询

1、概述

平时开发业务逻辑中经常遇到查询所有父类及子类、三级分类、所有菜单以及子菜单、所有部门以及子部门类似的需求,如何使用递归构造这样的树数据呢?

2、数据库

类似业务分类、菜单、部门类似的需求数据库表只需一张即可,如下(没有父分类 则parentid=0)

主要是分类id以及当前分类所属的父分类parent_id。

3、实体类设计

public class Category {
    private IntegercatId;
    private String name;
    private Integer parentCid;
 
    //用来存储子分类list
    private List<Category> children;
}

省去了get以及set方法

4、分析代码实现步骤

//获取树型列表
public List<Category> listWithTree() {
        //首先查询所有分类的一级父类id列表
        List<Category> categoryList = categoryDao.selectList();
        List<Category> categoryListWithTree = categoryList.stream().filter(category->
            category.getParentCid()==0
        ).map((menu)->{
            menu.setChildren(getChildrens(menu,categoryList));
            return menu;
        }).sorted((menu1,menu2)->{//按照分类id排序
            return menu1.getCatId()-menu2.getCatId();
        }).collect(Collectors.toList());
        return categoryListWithTree;
    }
 
 
//递归查询当前分类的所有子分类
public List<Category> getChildrens(Category root,List<Category> all){
        List<Category> childrens = all.stream().filter(category -> {
            return category.getParentCid()==root.getCatId();
        }).map((category)->{
            category.setChildren(getChildrens(category,all));
            return category;
        }).sorted((menu1,menu2)->{//按照分类id排序
            return (menu1.getCatId()==null?0:menu1.getCatId())-(menu2.getCatId()==null?0:menu2.getCatId());
        }).collect(Collectors.toList());
        return  childrens;
    }

测试

二、查询某个父类的所有子父类集合(非树结构)

基础类

//省略get set
public class Menu {
    private Integer id;
    private String name;
    private Integer pid;
}
 
public List<Menu> getChildren(Integer pid, List<Menu> all, List<Menu> children) {
        for (Menu d : all) {
            //遍历出父id等于参数的id,add进子节点集合
            if (d.getPid().equals(pid)) {
                //递归遍历下一级
                getChildren(d.getId(), all, children);
                children.add(d);
            }
        }
        return children;
    }
public void test(){
        List<Menu > children = new ArrayList<>();
        List<Menu > all = new ArrayList<>();
        children = getChildren(0, all, children);
        for (Menu  d : children) {
           System.out.println(d.getName());
        }
    }


相关文章
|
12月前
|
机器学习/深度学习 存储 Java
分支结构 && 方法的创建和调用 && 方法递归 && 数组的创建和使用 && 类和对象的认识 && 内部类 && 认识继承
分支结构 && 方法的创建和调用 && 方法递归 && 数组的创建和使用 && 类和对象的认识 && 内部类 && 认识继承
55 0
|
5月前
在实现链表的代码中,为什么要使用继承而不是组合?
在实现链表的代码中,为什么要使用继承而不是组合?
32 3
一文彻底搞懂父类引用指向子类对象问题
一文彻底搞懂父类引用指向子类对象问题
184 1
|
存储
简单链表实现增删改查(内部类+递归)
简单链表实现增删改查(内部类+递归)
44 0
|
Java 索引
JVM虚拟机-Class文件之类索引、父类索引和接口索引集合
JVM虚拟机-Class文件之类索引、父类索引和接口索引集合
109 1
JVM虚拟机-Class文件之类索引、父类索引和接口索引集合
|
编译器 C++
C++类对象构造顺序
C++类对象构造顺序
53 0
C++类对象构造顺序
数据结构与算法__08--霍夫曼树二叉树遍历:1.写在节点类中,在上层调用;2.写在主函数中一次性整体完成
霍夫曼树二叉树遍历:1.写在节点类中,在上层调用;2.写在主函数中一次性整体完成
python-查找子类和父类之间有多少继承关系
python-查找子类和父类之间有多少继承关系
68 0
关于纯虚函数继承子类 ,父类指向子类后 将父类指针转为子指针,就可以调用子类其他接口
关于纯虚函数继承子类 ,父类指向子类后 将父类指针转为子指针,就可以调用子类其他接口
关于纯虚函数继承子类 ,父类指向子类后 将父类指针转为子指针,就可以调用子类其他接口