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

news2024/10/5 18:33:50

文章目录

    • 一、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外卖订购系统
  • 【数据结构学习】从零起步:学习数据结构的完整路径

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

落石滑坡监测报警系统:创新保障高速公路安全

​ ​​在现代交通建设中&#xff0c;高速公路的安全性和稳定性至关重要。特别是易发生落石区域&#xff0c;如何有效预防和应对落石滑坡带来的事故成为了一项关键性挑战。为此&#xff0c;落石滑坡监测报警系统应运而生&#xff0c;它通过先进的技术手段&#xff0c;为高速…

汇聚荣拼多多运营好吗?

在当前电商行业竞争激烈的背景下&#xff0c;拼多多凭借其独特的商业模式和市场定位迅速崛起&#xff0c;成为众多商家和品牌争相入驻的平台。对于“汇聚荣拼多多运营好吗?”这一问题&#xff0c;答案是肯定的。拼多多不仅提供了一个广阔的市场空间&#xff0c;还通过其创新的…

C++输出彩色方块

1.使用方法 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0xab); ———————————————————————————————————————— 0 黑色 1 蓝色 2 绿色 3 湖蓝色 4 红色 5 紫色 6 黄色 7 白色 8 灰色 9 …

linux下安装kkFileView4

kkFileView为文件文档在线预览解决方案&#xff0c;该项目使用流行的spring boot搭建&#xff0c;易上手和部署&#xff0c;基本支持主流办公文档的在线预览&#xff0c;如doc,docx,xls,xlsx,ppt,pptx,pdf,txt,zip,rar,图片,视频,音频等等 安装kkFileView前需要安装LibreOffic…

HarmonyOS开发:应用完整性校验

简介 为了确保应用的完整性和来源可靠&#xff0c;OpenHarmony需要对应用进行签名和验签。 应用开发阶段&#xff1a; 开发者完成开发并生成安装包后&#xff0c;需要开发者对安装包进行签名&#xff0c;以证明安装包发布到设备的过程中没有被篡改。OpenHarmony的应用完整性校…

推理之巅 超云为先|2024中国智算中心全栈技术大会,超云引领AI算力新趋势

在AI技术日新月异的浪潮中&#xff0c;算力作为推动数字经济发展的关键力量&#xff0c;正迎来全新的发展机遇。 6月25日至27日&#xff0c;以“AI赋能&#xff0c;重构未来”为主题的2024中国智算中心全栈技术大会、第5届中国数据中心绿色能源大会暨第10届中国&#xff08;上…

在本地和Linux之间传输文件

1.打开本地的cmd窗口 2. 然后按这个链接的说法在cmd中远程连接Linux&#xff08;技术|如何在 Linux 中使用 sFTP 上传或下载文件与文件夹&#xff09; 3. 看这个链接里面的sftp命令进行本地和Linux之间的文件互传 &#xff08;https://www.cnblogs.com/niuben/p/13324099.htm…

【机器学习】阿里Qwen-VL:基于FastAPI私有化部署你的第一个AI多模态大模型

目录 一、引言 二、Qwen-VL 介绍 2.1 Qwen-VL 特点 2.2 Qwen-VL 原理 2.3 Qwen-VL 模型结构 三、FastAPI封装Qwen-VL大模型服务接口 3.1 FastAPI 极简入门 3.1.1 FastAPI 3.1.2 uvicorn 3.1.3 pydantic 3.2 QwenVL-API服务端 3.2.1 代码示例 3.2.2 代码详解 3.…

机器人控制系列教程之关节空间运动控制器搭建(1)

机器人位置控制类型 机器人位置控制分为两种类型&#xff1a; 关节空间运动控制—在这种情况下&#xff0c;机器人的位置输入被指定为一组关节角度或位置的向量&#xff0c;这被称为机器人的关节配置&#xff0c;记作q。控制器跟踪一个参考配置&#xff0c;记作 q r e f q_{re…

WordPress Quiz Maker插件 SQL注入漏洞复现(CVE-2024-6028)

0x01 产品简介 WordPress Quiz Maker插件是一款功能强大的测验生成工具,旨在帮助用户轻松、快速地构建复杂的测验和考试。插件支持多种问题类型,包括单选框(MCQ)、复选框(MCQ)、下拉列表(MCQ)、文本、短文本、数字、日期等。还支持横幅(HTML)显示信息性消息、填空题…

权限维持-域环境单机版---映像劫持(多)

目录 映像位置: 测试&#xff1a;执行 notepad 成 cmd 配合GlobalFlag隐藏-->执行正常关闭后触发 映像位置: 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\notepad.exe 测试&#xff1a;执行 notepad 成 cmd…

数据结构--堆(图文)

在开始学习堆之前&#xff0c;我们要先简单了解二叉树 二叉树 一棵二叉树是结点的一个有限集合&#xff0c;该集合: 为空由一个根结点加上两棵子树&#xff08;左子树和右子树&#xff09; 特殊的二叉树&#xff1a; 满二叉树&#xff1a;一个二叉树&#xff0c;如果每一…

python 第6册 辅助excel 002 批量创建非空白的 Excel 文件

---用教授的方式学习 此案例主要通过使用 while 循环以及 openpyxl. load_workbook()方法和 Workbook 的 save()方法&#xff0c;从而实现在当前目录中根据已经存在的Excel 文件批量创建多个非空白的Excel 文件。当运行此案例的Python 代码&#xff08;A002.py 文件&#xff0…

Ubuntu20.04安装vimplus插件

参考文章&#xff1a; Ubuntu Linux下vimplus的安装及使用安装vimplus之后乱码问题解决 1、安装步骤&#xff1a; $ git clone https://github.com/chxuan/vimplus.git ~/.vimplus$ cd ~/.vimplus$ ./install.sh2、./install.sh 过程 出现选择是否备份 /home/yin-roc/.vim…

制造企业用AI可以做什么?

ChatGPT横空出世&#xff0c;有关AI的浪潮席卷全球&#xff0c;比起人工智能如何改变世界&#xff0c;可能你更感兴趣我能用AI可以做的事情是什么&#xff1f; 制造企业用AI可以做的事情是什么?人工智能在制造企业中可以做很多事情&#xff0c;以下是一些主要的应用&#xff1…

冯雷老师:618大退货事件分析

近日冯雷老师受邀为某头部电商36名高管进行培训&#xff0c;其中聊到了今年618退货潮的问题。以下内容整理自冯雷老师的部分授课内容。 一、引言 随着电子商务的蓬勃发展&#xff0c;每年的618大促已成为消费者和商家共同关注的焦点。然而&#xff0c;在销售额不断攀升的同时…

夏天到了,用这两款软件,悄悄惊艳所有人!

哈喽&#xff0c;各位小伙伴们好&#xff0c;我是给大家带来各类黑科技与前沿资讯的小武。 夏天来了&#xff0c;又到了“露肉”的季节&#xff0c;或许大家会为了身材烦恼&#xff0c;即便有运动意愿却苦于健身计划和时间上安排&#xff0c;也没有合适的免费软件。 别担心&a…

React+TS前台项目实战(十九)-- 全局常用组件封装:带加载状态和清除等功能的Input组件实现

文章目录 前言Input组件1. 功能分析2. 代码详细注释3. 使用方式4. 效果展示 总结 前言 今天我们来封装一个input输入框组件&#xff0c;并提供一些常用的功能&#xff0c;你可以选择不同的 尺寸、添加前缀、显示加载状态、触发回调函数、自定义样式 等等。这些功能在这个项目中…

JAVA高级进阶13单元测试、反射、注解

第十三天、单元测试、反射、注解 单元测试 介绍 单元测试 就是针对最小的功能单元(方法)&#xff0c;编写测试代码对其进行正确性测试 咱们之前是如何进行单元测试的&#xff1f; 有啥问题 &#xff1f; 只能在main方法编写测试代码&#xff0c;去调用其他方法进行测试。 …