当前位置: 首页 > news >正文

树形结构的工具类TreeUtil

这个地方是以null为根节点,相关以null或者0自己在TreeUtil中加代码,就行
基础类

package com.jm.common.entity;

import lombok.Data;

import java.util.ArrayList;
import java.util.List;

/**
 * @Author:JianWu
 * @Date: 2025/3/26  9:02
 */
@Data
public class BaseTree <T> {
    private Integer id;
    private Integer parentId;
    private List<T> children = new ArrayList<>();
}

工具类

package com.jm.common.util;

import com.jm.common.entity.BaseTree;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @Author:JianWu
 * @Date: 2025/3/25  17:56
 */
public class TreeUtils {


    /**
     * 将扁平化的 List 转换为树形结构
     *
     * @param list 扁平化的节点列表
     * @return 树形结构的根节点列表
     */
    public static <T extends BaseTree> List<T> buildTree(List<T> list) {
        // 用于存储所有节点的映射表
        Map<Integer, T> nodeMap = new HashMap<>();
        // 用于存储根节点的列表
        List<T> roots = new ArrayList<>();

        // 将所有节点放入映射表
        for (T node : list) {
            nodeMap.put(node.getId(), node);
        }

        // 构建树形结构
        for (T node : list) {
            Integer parentId = node.getParentId();
            if (parentId == null) {
                // 如果 parentId 为 null,说明是根节点
                roots.add(node);
            } else {
                // 否则,找到父节点并添加到其子节点列表
                T parent = nodeMap.get(parentId);
                if (parent != null) {
                    parent.getChildren().add(node);
                }
            }
        }

        return roots;
    }
}

调用类

public List<DictDataTreeResp> getDictDataTree() {
        List<DictDataTreeResp> allDictDataList = baseMapper.getTypeDataList();
        List<DictDataTreeResp> dictDataTreeResps = TreeUtils.buildTree(allDictDataList);
        return dictDataTreeResps;
    }

相关文章:

  • 【MySQL】从零开始:掌握MySQL数据库的核心概念(四)
  • 为什么视频文件需要压缩?怎样压缩视频体积即小又清晰?
  • java实现动态修改表数据,方便扩展
  • 【数据转换】- Halcon<->Mat
  • 为Windows10的WSL Ubuntu启动sshd服务并使用Trae远程连接
  • 软考网络工程师上午题
  • AndroidStudio无法识别连接夜神模拟器
  • Android开发:基于 Kotlin 协程的设备指令控制工具类设计与实现
  • Kong 可观测性最佳实践
  • 前端国际化-插件模式
  • Linux网站搭建(新手必看)
  • 项目启动报Error: cannot find module ‘node:path’
  • XXL-Job 处理大数据量并发任务的解决方案及底层原理
  • Java面试黄金宝典15
  • C#/.NET/.NET Core技术前沿周刊 | 第 31 期(2025年3.17-3.23)
  • 2、学习Docker前置操作
  • 深度学习框架PyTorch——从入门到精通(10)PyTorch张量简介
  • 第七章:优化热点语句_《C++性能优化指南》_notes
  • Day24:队列的最大值
  • 音视频新人如何快速上手nginx-rtmp-module
  • 解放日报:让算力像“水电煤”赋能千行百业
  • 八成盈利,2024年沪市主板公司实现净利润4.35万亿元
  • 海南机场拟超23亿元收购美兰空港控股权,进一步聚焦机场主业
  • 欢迎回家!神十九返回舱成功着陆
  • 大型长读长RNA测序数据集发布,有助制定精准诊疗策略
  • 北大深圳研究生院成立科学智能学院:培养交叉复合型人才