使用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(); // 获取节点IDT getParentId(); // 获取父节点IDvoid 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;}@Overridepublic Long getId() {return id;}@Overridepublic Long getParentId() {return parentId;}@Overridepublic void setChildren(List<TreeNode<Long>> children) {this.children = children;}@Overridepublic List<TreeNode<Long>> getChildren() {return children;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic 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.mzph.cn/diannao/37890.shtml

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

相关文章

基于vue脚手架创建的图书商城

功能简介 此项目包括首页, 搜索列表, 商品详情, 购物车, 订单, 支付, 用户登陆/注册等多个子模块&#xff0c;使用 Vue 全家 桶ES6WebpackAxios 等技术&#xff0c;采用模块化、组件化、工程化的模式开发。 功能模块图 2.1首页 2.2.搜索列表 2.3.商品详情 2.4.购物车 2.5.支…

条件测试,if语句,case语句

测试命令 格式1&#xff1a;test 条件表达式 格式2&#xff1a;[条件表达式] test命令和 [ ] 相同&#xff0c;建议使用[ ] #方框中要空格 #用test可能会不小心定义变量文件测试 常见的测试操作符含义-d检查文件是否存在且为目录-f检查文件是否存在且为常规文件-L测试…

解决json日期格式问题

解决json日期格式问题 1.json默认输出时间格式 RequestMapping("/json3") public String json3() throws JsonProcessingException {ObjectMapper mapper new ObjectMapper();//创建时间一个对象&#xff0c;java.util.DateDate date new Date();//将我们的对象解…

Knife4j:快速入门

1. 概述 Knife4j是一个用于生成和展示API文档的工具&#xff0c;同时它还提供了在线调试的功能&#xff0c;下图是其工作界面。 * Knife4j有多个版本&#xff0c;最新版的Knife4j基于开源项目springdoc-openapi&#xff0c;这个开源项目的核心功能就是根据SpringBoot项目中的代…

uniapp uniCloud云开发

uniCloud概述 uniCloud 是 DCloud 联合阿里云、腾讯云、支付宝云&#xff0c;为开发者提供的基于 serverless 模式和 js 编程的云开发平台。 uniCloud 的 web控制台地址&#xff1a;https://unicloud.dcloud.net.cn 文档&#xff1a;https://doc.dcloud.net.cn/uniCloud/ un…

大模型应用-多模态和大模型是如何相互成就的

前言 如果单纯的将大模型用来聊天&#xff0c;那就是low了。 而多模态赋予了大模型更多的现实价值&#xff0c;大模型则助力多模态变得更强大。 多模态 我们所处的是一个物理世界&#xff0c;不同事物之间模态多种多样&#xff0c;即便是简单的文本&#xff0c;按照语言&am…

【Docker0】网络更改

目录 1. 停止docker服务 2. 关闭docker默认桥接网络接口 3. 从系统删除docker0接口 4. 创建一个名为bridge0的新接口 5. 添加ip地址和子网掩码 6. 启用bridge0接口 7. &#xff08;如果没起来就执行该句&#xff09; 8. 查看ip 1. 停止docker服务 sudo service docker…

c++用什么软件编程?都有哪些?

c用什么软件编程&#xff1f;都有哪些&#xff1f; C 作为一种高效、面向对象的编程语言&#xff0c;广泛应用于软件开发、游戏开发、嵌入式系统等领域。那么在进行 C 编程时&#xff0c;我们通常会使用哪些软件呢&#xff1f;下面就来具体分析。 1. Visual Studio Visual Stu…

深入 SSH:解锁本地转发、远程转发和动态转发的潜力

文章目录 前言一、解锁内部服务&#xff1a;SSH 本地转发1.1 什么是 SSH 本地转发1.2 本地转发应用场景 二、打开外部访问大门&#xff1a;SSH 远程转发2.1 什么是 SSH 远程转发2.2 远程转发应用场景 三、动态转发&#xff1a;SSH 让你拥有自己的 VPN3.1 什么是 SSH 动态转发3.…

mysqldump全备份之后,如何只恢复一个库或者一个表

在实际工作中,一个MySQL实例中可能有多个database。而我们备份时,通常采用完全备份,将所有database都备份到一个文件中。 但是,偶尔会遇到只恢复一个database或者一个表的情况。怎么解决呢? 一、利用全备恢复一个库(database)的数据 案例:朋友在群里问, MySQL全库备份…

memory动态内存管理学习之weak_ptr

此头文件是动态内存管理库的一部分。std::weak_ptr 是一种智能指针&#xff0c;它持有对被 std::shared_ptr 管理的对象的非拥有性&#xff08;“弱”&#xff09;引用。在访问所引用的对象前必须先转换为 std::shared_ptr。std::weak_ptr 用来表达临时所有权的概念&#xff1a…

three.js实现雪花场景效果

点击获取雪花图片素材 提取码:lywa // 雪花效果 import * as THREE from "three" export function getsnowEffect(th) {console.log(th, th) // this 场景var that th// 创建一个BufferGeometry对象&#xff0c;用于存储顶点数据 const geometry new THREE.Buffe…

Vim神兵:精通自定义补全规则

标题&#xff1a;Vim神兵&#xff1a;精通自定义补全规则 摘要 Vim作为Linux上最强大的文本编辑器之一&#xff0c;其补全功能可以极大提高编码效率。本文将详细探讨如何在Vim中自定义补全规则&#xff0c;包括基本的补全设置、使用Vim脚本扩展补全功能&#xff0c;以及如何利…

大模型微调实战之基于星火大模型的群聊对话分角色要素提取挑战赛:Task01:跑通Baseline

目录 0 背景1 环境配置1.1 下载包1.2 配置密钥1.3 测试模型 2 解决问题2.1 获取数据2.2 设计Prompt2.2 设计处理函数2.3 开始提取 附全流程代码 0 背景 Datawhale AI夏令营第二期开始啦&#xff0c;去年有幸参与过第一期&#xff0c;收获很多&#xff0c;这次也立马参与了第二…

VMware ESXi 技术

目录 一、VMware ESXi安装 1. 在VMware WorkStation中创建一台虚拟机 2. 进入VMware ESXi控制台 3. 配置VMware ESXi网络 二、使用Web网页端登录管理ESXi 1. 分配许可证密钥&#xff08;选做&#xff09; 2. 管理ESXi 三、VMware ESXi控制台 1. 创建虚拟机 2. 定制虚拟…

Webpack: 开发 PWA、Node、Electron 应用

概述 毋庸置疑&#xff0c;对前端开发者而言&#xff0c;当下正是一个日升月恒的美好时代&#xff01;在久远的过去&#xff0c;Web 页面的开发技术链条非常原始而粗糙&#xff0c;那时候的 JavaScript 更多用来点缀 Web 页面交互而不是用来构建一个完整的应用。直到 2009年5月…

LINUX操作系统:Mx Linux,用虚拟机VMware Workstation安装体验

需求说明&#xff1a; 操作系统目前流行有Windows、Linux、Unix等&#xff0c;中国人应该要知道国有操作系统&#xff0c;也要支持国产操作系统&#xff0c;为了更好支持国产操作系统&#xff0c;我们也要知己知彼&#xff0c;那么今天就来体验一把操作系统Mx_Linux_23.2的安装…

分享一个下载windows系统镜像包的网站

下载各种操作系统&#xff08;比如Windows、Linux、MacOS等&#xff09;比较快的镜像站点&#xff0c;我尝试过这个不错&#xff0c;提供了BT连接&#xff0c;可以用迅雷软件下载&#xff0c;速度很快的&#xff01; 入口地址&#xff1a;NEXT, ITELLYOU 1&#xff09;打开网站…

[XYCTF新生赛2024] pwn

用了一周来复现crypto部分(不能算是复现&#xff0c;拿着 糖醋小鸡块的WP一点点学了下)。 两天时间复现PWN部分。相对来说PWN比密码这块要简单&#xff0c;不过ARM,MIPS懒得学了&#xff0c;跳过。 malloc_flag 题目先打开flag将建0x100的块&#xff0c;然后把flag读入再fre…

[深度学习] Transformer

Transformer是一种深度学习模型&#xff0c;最早由Vaswani等人在2017年的论文《Attention is All You Need》中提出。它最初用于自然语言处理&#xff08;NLP&#xff09;任务&#xff0c;但其架构的灵活性使其在许多其他领域也表现出色&#xff0c;如计算机视觉、时间序列分析…