Java通用的获取树形结构

本文分享了一种在控制器中实现树形数据结构的方法,通过递归获取子节点,将数据库中的多层级数据转换为树状结构,适用于各种实体类,只需简单修改即可使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据库数据是树形的,有很多层,不能每层都去循环一次,所有我在网上找了资料来总结下,代码都有实现过的(只要更换一些实体类名称就可以了,照猫画虎)
本人是一枚初到职场的小白,也在学习过程,本文章就是学习记录,希望能够帮到你们,如果不足,请多指教~~

第一步 :在实体类添加一个List存放子数据

在这里插入图片描述

第二步:直接复制一下代码放到controller文件下

一些实体类报错的地方修改你当前的实体类就行了

 @GetMapping("/listTree")
    public AjaxResult listTree(Student student)
    {
        List<Student> list = studentService.selectStudentList(student);
        return AjaxResult.success(getListTree(list));
    }
    // 判断树形结构
    public List<Student > getListTree(List<Student > students ){
        //存储非根节点
        Map<Long,List<Student>> tempMap=new HashMap<>();
        //存储最终的结果
        List<Student> resultList=new ArrayList<>();
        //遍历数据库查询数据集合,如果父id==0 代表根节点 添加到最终结果中,否则为非根节点添加到临时节点
        for(Student student: students){
            if(student.getPid() == 0){
                resultList.add(student);
            }else{
                if(tempMap.containsKey(student.getPid())){
                    tempMap.get(student.getPid()).add(student);
                }else{
                    List<Student> sList = new ArrayList<>();
                    sList.add(student);
                    tempMap.put(student.getPid(),sList);
                }
            }
        }
        // 遍历所有根节点,通过根节点和非根节点集合,找到这个根节点的所有子节点
        for (Student s: resultList){
            getChildNode(tempMap, Arrays.asList(s));
        }
        return resultList;
    }
    public static  void getChildNode(Map<Long,List<Student>> tempMap,List<Student> fatherNodeList  ){
        for (Student ify : fatherNodeList) {
            if (tempMap.containsKey(ify.getStudentId())) {
                ify.getChildren().addAll(tempMap.get(ify.getStudentId()));
                getChildNode(tempMap,tempMap.get(ify.getStudentId()));
            }
        }
    }

这个接口就可以返回树形结构了

对了有个点是这块要拿最高的父id进行判断,需要根据自己数据库数据进行调整,我的最高父id是0
在这里插入图片描述

效果图如下

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值