使用Java实现通用树形结构转换工具类:深入解析TreeUtil和TreeNode接口

文章目录

    • 一、TreeNode接口设计
    • 二、TreeUtil工具类设计
    • 三、示例:实现TreeNode接口的节点类
    • 四、示例:使用TreeUtil构建树形结构
    • 五、总结

在这里插入图片描述

🎉欢迎来到Java学习路线专栏~探索Java中的静态变量与实例变量


  • ☆* o(≧▽≦)o *☆嗨~我是IT·陈寒🍹
  • ✨博客主页:IT·陈寒的博客
  • 🎈该系列文章专栏:Java学习路线
  • 📜其他专栏:Java学习路线 Java面试技巧 Java实战项目 AIGC人工智能 数据结构学习
  • 🍹文章作者技术和水平有限,如果文中出现错误,希望大家能指正🙏
  • 📜 欢迎大家关注! ❤️

在实际开发中,树形结构的数据处理是一个常见的需求。例如,组织架构、分类管理、评论回复等,都需要将数据以树形结构展示。本文将深入解析如何使用Java实现一个通用的树形结构转换工具类,包括 TreeUtilTreeNode 接口的设计与实现。

一、TreeNode接口设计

首先,我们需要设计一个 TreeNode 接口,用于约束树节点对象必须具备的一些基本功能和属性。具体包括获取节点ID、父节点ID和子节点列表的方法。

public interface TreeNode<T> {
    T getId(); // 获取节点ID
    T getParentId(); // 获取父节点ID
    void setChildren(List<TreeNode<T>> children); // 设置子节点列表
    List<TreeNode<T>> getChildren(); // 获取子节点列表
}

二、TreeUtil工具类设计

接下来,我们设计一个 TreeUtil 工具类,用于将平铺的数据列表转换为树形结构。主要包括两个方法:buildTreefindRootNodes

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

public class TreeUtil {

    /**
     * 将平铺的数据列表转换为树形结构
     * @param nodes 所有节点列表
     * @param rootParentId 根节点的父ID
     * @param <T> 节点ID类型
     * @return 树形结构列表
     */
    public static <T> List<TreeNode<T>> buildTree(List<TreeNode<T>> nodes, T rootParentId) {
        // 创建一个ID到节点的映射
        Map<T, TreeNode<T>> nodeMap = new HashMap<>();
        for (TreeNode<T> node : nodes) {
            nodeMap.put(node.getId(), node);
        }

        // 创建一个用于存储根节点的列表
        List<TreeNode<T>> rootNodes = new ArrayList<>();

        // 遍历所有节点,将节点挂载到其父节点上
        for (TreeNode<T> node : nodes) {
            T parentId = node.getParentId();
            if (rootParentId.equals(parentId)) {
                rootNodes.add(node);
            } else {
                TreeNode<T> parentNode = nodeMap.get(parentId);
                if (parentNode != null) {
                    List<TreeNode<T>> children = parentNode.getChildren();
                    if (children == null) {
                        children = new ArrayList<>();
                        parentNode.setChildren(children);
                    }
                    children.add(node);
                }
            }
        }
        return rootNodes;
    }

    /**
     * 从平铺的数据列表中找到所有根节点
     * @param nodes 所有节点列表
     * @param rootParentId 根节点的父ID
     * @param <T> 节点ID类型
     * @return 根节点列表
     */
    public static <T> List<TreeNode<T>> findRootNodes(List<TreeNode<T>> nodes, T rootParentId) {
        List<TreeNode<T>> rootNodes = new ArrayList<>();
        for (TreeNode<T> node : nodes) {
            if (rootParentId.equals(node.getParentId())) {
                rootNodes.add(node);
            }
        }
        return rootNodes;
    }
}

三、示例:实现TreeNode接口的节点类

为了更好地理解 TreeNode 接口和 TreeUtil 工具类的使用,下面实现一个具体的节点类 CategoryNode

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

public class CategoryNode implements TreeNode<Long> {
    private Long id;
    private Long parentId;
    private String name;
    private List<TreeNode<Long>> children = new ArrayList<>();

    public CategoryNode(Long id, Long parentId, String name) {
        this.id = id;
        this.parentId = parentId;
        this.name = name;
    }

    @Override
    public Long getId() {
        return id;
    }

    @Override
    public Long getParentId() {
        return parentId;
    }

    @Override
    public void setChildren(List<TreeNode<Long>> children) {
        this.children = children;
    }

    @Override
    public List<TreeNode<Long>> getChildren() {
        return children;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "CategoryNode{" +
                "id=" + id +
                ", parentId=" + parentId +
                ", name='" + name + '\'' +
                ", children=" + children +
                '}';
    }
}

四、示例:使用TreeUtil构建树形结构

接下来,通过示例数据,展示如何使用 TreeUtil 构建树形结构。

import java.util.Arrays;
import java.util.List;

public class TreeUtilExample {

    public static void main(String[] args) {
        List<TreeNode<Long>> nodes = Arrays.asList(
                new CategoryNode(1L, 0L, "Root Node"),
                new CategoryNode(2L, 1L, "Child Node 1"),
                new CategoryNode(3L, 1L, "Child Node 2"),
                new CategoryNode(4L, 2L, "Child Node 1.1"),
                new CategoryNode(5L, 2L, "Child Node 1.2"),
                new CategoryNode(6L, 3L, "Child Node 2.1")
        );

        List<TreeNode<Long>> tree = TreeUtil.buildTree(nodes, 0L);

        for (TreeNode<Long> node : tree) {
            System.out.println(node);
        }
    }
}

运行上述示例代码,输出结果如下:

CategoryNode{id=1, parentId=0, name='Root Node', children=[CategoryNode{id=2, parentId=1, name='Child Node 1', children=[CategoryNode{id=4, parentId=2, name='Child Node 1.1', children=[]}, CategoryNode{id=5, parentId=2, name='Child Node 1.2', children=[]}]}, CategoryNode{id=3, parentId=1, name='Child Node 2', children=[CategoryNode{id=6, parentId=3, name='Child Node 2.1', children=[]}]}]}

五、总结

通过以上步骤,我们实现了一个通用的树形结构转换工具类 TreeUtil,并结合 TreeNode 接口实现了具体的节点类 CategoryNode。通过示例数据,展示了如何使用 TreeUtil 构建树形结构。希望这篇文章能帮助你在实际开发中更好地处理树形结构数据。


🧸结尾 ❤️ 感谢您的支持和鼓励! 😊🙏
📜您可能感兴趣的内容:

  • 【Java面试技巧】Java面试八股文 - 掌握面试必备知识(目录篇)
  • 【Java学习路线】2023年完整版Java学习路线图
  • 【AIGC人工智能】Chat GPT是什么,初学者怎么使用Chat GPT,需要注意些什么
  • 【Java实战项目】SpringBoot+SSM实战:打造高效便捷的企业级Java外卖订购系统
  • 【数据结构学习】从零起步:学习数据结构的完整路径

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/757476.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

three.js - MeshStandardMaterial(标准网格材质)- 金属贴图、粗糙贴图

金属贴图、粗糙贴图 金属贴图&#xff1a;metalnessMap 和 粗糙贴图&#xff1a;roughnessMap&#xff0c;是用于模拟物体表面属性的两种重要贴图技术&#xff0c;这两种贴图&#xff0c;通常与基于物理的渲染&#xff08;PBR&#xff09;材质&#xff08;如&#xff1a;MeshSt…

工业数据分析要用FusionInsight MRS IoTDB ?

随着工业互联网逐步兴起&#xff0c;在加速工业自动化、智能化的同时&#xff0c;也进一步加速工业生产时间序列数据的产生速度。但对于工业生产中的数据分析&#xff0c;仍然存在重复样本多&#xff0c;数据膨胀率大&#xff0c;缺乏专业易用的平台&#xff0c;这些问题成为阻…

UE5的安装与基本操作(一)

文章目录 前言安装UE5新建第一个游戏项目基本游览方式对目标进行变换各种变换对齐 快速定位目标 总结 前言 Unreal Engine 5 (UE5) 是一款由 Epic Games 开发的实时 3D 创作平台&#xff0c;用于制作游戏、电影、动画、建筑可视化和其他类型的交互式体验。UE5 提供了一系列强大…

实验 1 图像基本操作

1. 实验目的 ①熟悉 Photoshop 基本操作&#xff1b; ②掌握 Matlab 、PythonOpenCV 中处理图像的基本方法&#xff1b; ③掌握图像的半调转换和抖动转换。 2. 实验内容 ①Photoshop 基本操作&#xff1a;打开图像文件&#xff0c;选择区域&#xff0c;旋转、裁剪图像、图层…

Redis 缓存预热、缓存雪崩、缓存击穿、缓存穿透业务实践

0、前言 本文所有代码可见 > 【gitee code demo】 本文会涉及 缓存预热、缓存雪崩、缓存击穿、缓存穿透介绍和解决方案业务实践 1、缓存预热 1.1、描述 提前将热点数据加载到缓存&#xff0c;提前响应&#xff0c;降低后端数据源访问压力 1.2、实践 Autowiredprivate R…

Perl入门学习

Perl是一种强大的脚本语言&#xff0c;以其灵活性和文本处理能力而闻名&#xff0c;常用于系统管理、Web开发、生物信息学以及数据处理等领域。以下是Perl语言入门学习的一些关键点&#xff1a; ### 1. Perl简介 - **起源与特点**&#xff1a;Perl由Larry Wall在1987年创建&am…

springboot+vue+mybatis奶茶管理系统+PPT+论文+讲解+售后

由于科学技术的快速发展&#xff0c;人们的生活也与信息时代的发展相关。同时&#xff0c;随着市场化和经济化的发展&#xff0c;国内很多行业已经意识到了这一点&#xff0c;为了提升行业的竞争力&#xff0c;就应当率先把握机会。于是在互联网的默化潜移影响下&#xff0c;餐…

ctfshow-web入门-命令执行(web56、web57、web58)

目录 1、web56 2、web57 3、web58 1、web56 命令执行&#xff0c;需要严格的过滤 新增过滤数字&#xff0c;只能采用上一题临时文件上传的方法&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><…

MySQL高级-事务-并发事务演示及隔离级别

文章目录 0、四种隔离级别1、创建表 account2、修改当前会话隔离级别为 read uncommitted2.1、会出现脏读 3、修改当前会话隔离级别为 read committed3.1、可以解决脏读3.2、会出现不可重复读 4、修改当前会话隔离级别为 repeatable read&#xff08;默认&#xff09;4.1、解决…

计算机网络之体系结构

上节内容&#xff1a;数据通信原理 1.计算机网络体系结构 体系结构: 研究系统中各组成成分及其关系的一门学科。 计算机网络体系结构: 定义和描述一组用于计算机及其通信设施之间互连的标准和规范的集合&#xff0c;遵循这组规范可以很方便地实现计算机设备之间的通信。 相互…

2024百度之星第一场-110串

补题链接&#xff1a; 码蹄集 三个状态转移的计数dp 先确定状态 n个数至多修改k次&#xff0c;保证不出现字串“110” 常规想法先把状态确定为dp[n][k][0/1]&#xff0c;前n个数&#xff0c;修改k次后&#xff0c;末尾数为0/1&#xff0c;不能转移再换思路。 初始状态设定如…

[Cloud Networking] BGP

1. AS (Autonomous System) 由于互联网规模庞大&#xff0c;所以网络会被分为许多 自治系统&#xff08;AS-Autonomous system&#xff09;。 所属类型ASN名称IPv4 数量IPv6数量运营商ISPAS3356LEVEL3 - Level 3 Parent, LLC, US29,798,83273,301,954,048互联网企业AS15169GO…

自适应IT互联网营销企业网站pbootcms模板

模板介绍 一款蓝色自适应IT互联网营销企业网站pbootcms模板&#xff0c;该模板采用响应式设计&#xff0c;可自适应手机端&#xff0c;适合一切网络技术公司、互联网IT行业&#xff0c;源码下载&#xff0c;为您提供了便捷哦。 模板截图 源码下载 自适应IT互联网营销企业网站…

【PyQt】20-QTimer(动态显示时间、定时关闭)

QTimer 前言一、QTimer介绍二、动态时间展示2.1 代码2.2 运行结果 三、定时关闭3.1 介绍他的两种用法1、使用函数或Lambda表达式2、带有定时器类型&#xff08;高级&#xff09; 3.2 代码3.3 运行结果 总结 前言 好久没学习了。 一、QTimer介绍 pyqt里面的多线程可以有两种实…

Windows系统开启自带虚拟机功能Hyper-V

前言 最近有小伙伴咨询&#xff1a;Windows系统上有自带的虚拟机软件吗&#xff1f; 答案肯定是有的。它就是Hyper-V&#xff0c;但很多小伙伴都不知道怎么打开这个功能。 今天小白就带大家来看看如何正确打开这个Windows自带的虚拟机功能Hyper-V。 开始之前&#xff0c;你…

统计分析利器:深入解读卡方检验与单因素方差分析的应用案例【练习题】

一、卡方检验 1.对400人进行问卷调查&#xff0c;询问对于教学改革的看法&#xff0c;调查结果如下表所示&#xff0c;请问不同学科不同性别的人意见是否相同。 学科 男生 女生 工科 80 40 理科 120 160 &#xff08;性别&#xff0c;学科均无序分类>卡方检验&am…

音视频开发32 FFmpeg 编码- 视频编码 h264 参数相关

1. ffmpeg -h 这个命令总不会忘记&#xff0c;用这个先将ffmpeg所有的help信息都list出来 C:\Users\Administrator>ffmpeg -h ffmpeg version 6.0-full_build-www.gyan.dev Copyright (c) 2000-2023 the FFmpeg developersbuilt with gcc 12.2.0 (Rev10, Built by MSYS2 pro…

万字长文详解数据结构:树 | 第6章 | Java版大话数据结构 | 二叉树 | 哈夫曼树 | 二叉树遍历 | 构造二叉树 | LeetCode练习

&#x1f4cc;本篇分享的大话数据结构中&#x1f384;树&#x1f384;这一章的知识点&#xff0c;在此基础上&#xff0c;增加了练习题帮助大家理解一些重要的概念✅&#xff1b;同时&#xff0c;由于原文使用的C语言代码&#xff0c;不利于学习Java语言的同学实践&#xff0c;…

JS(JavaScript)事件处理(事件绑定)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

ChatGPT新纪元:揭秘GPT-4o的多模态能力

GPT-4o登场 探索ChatGPT的多模态创新 今日凌晨&#xff0c;OpenAI向全球宣布了AI发展的新篇章——GPT-4o&#xff0c;每次OpenAI发布重大更新时&#xff0c;尽管令人兴奋&#xff0c;但也不免使众多初创公司的梦想破灭。 GPT-4o的命名中的“o”象征着“omni”——全能的代表。…