Java实现公用实体类转Tree结构

 更新时间:2024年10月28日 11:30:48   作者:小信丶  
这篇文章主要为大家介绍了一个Java工具类,可以实现Java公用实体类转Tree结构,文中的示例代码简洁易懂,感兴趣的小伙伴可以参考一下

工具类

import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
 
// 树节点类,用于存储树中的每个元素
class TreeNode<T> {
    private T data; // 节点存储的数据
    private List<TreeNode<T>> children = new ArrayList<>(); // 子节点列表
 
    // 构造函数,初始化节点数据
    public TreeNode(T data) {
        this.data = data;
    }
 
    // 添加子节点
    public void addChild(TreeNode<T> child) {
        children.add(child);
    }
 
    // 获取当前节点的数据
    public T getData() {
        return data;
    }
 
    // 获取当前节点的所有子节点
    public List<TreeNode<T>> getChildren() {
        return children;
    }
}
 
// 树构建器类,负责从列表构建树形结构
class TreeBuilder<T> {
    // buildTree方法,构建树形结构
    public TreeNode<T> buildTree(List<T> items, Function<T, String> idExtractor, Function<T, String> parentIdExtractor) {
        // 创建一个映射,将每个节点的ID映射到对应的TreeNode对象
        Map<String, TreeNode<T>> nodeMap = items.stream()
                .map(item -> new TreeNode<>(item)) // 将每个元素转换为TreeNode
                .collect(Collectors.toMap(node -> idExtractor.apply(node.getData()), Function.identity()));
 
        TreeNode<T> root = null; // 用于存储根节点
        
        // 遍历每个元素,建立父子关系
        for (T item : items) {
            String id = idExtractor.apply(item); // 获取当前节点的ID
            String parentId = parentIdExtractor.apply(item); // 获取父节点的ID
            TreeNode<T> node = nodeMap.get(id); // 获取当前节点
            
            if (parentId == null) {
                root = node; // 假设只有一个根节点
            } else {
                TreeNode<T> parentNode = nodeMap.get(parentId); // 获取父节点
                if (parentNode != null) {
                    parentNode.addChild(node); // 将当前节点添加到父节点的子节点列表中
                }
            }
        }
        
        return root; // 返回构建的树的根节点
    }
}

注释说明:

TreeNode类:

  • 每个字段和方法都有注释,说明其用途。
  • 包含构造函数、添加子节点的方法以及获取数据和子节点的方法。

TreeBuilder类:

  • buildTree方法的逻辑注释清晰,解释了每一步的目的。
  • 使用映射将每个实体转换为树节点,并建立父子关系。

代码示例

import java.util.Arrays;
import java.util.List;
 
// 实体类,用于表示树节点的数据
class Entity {
    private String id;         // 节点ID
    private String parentId;   // 父节点ID
    private String name;       // 节点名称
 
    // 构造函数
    public Entity(String id, String parentId, String name) {
        this.id = id;
        this.parentId = parentId;
        this.name = name;
    }
 
    // 获取节点ID
    public String getId() {
        return id;
    }
 
    // 获取父节点ID
    public String getParentId() {
        return parentId;
    }
 
    // 获取节点名称
    public String getName() {
        return name;
    }
}
 
// 主程序
public class Main {
    public static void main(String[] args) {
        // 创建实体列表,模拟树形结构
        List<Entity> entities = Arrays.asList(
            new Entity("1", null, "Root"),         // 根节点
            new Entity("2", "1", "Child 1"),       // Child 1, 父节点为Root
            new Entity("3", "1", "Child 2"),       // Child 2, 父节点为Root
            new Entity("4", "2", "Grandchild 1")   // Grandchild 1, 父节点为Child 1
        );
 
        // 创建树构建器实例
        TreeBuilder<Entity> treeBuilder = new TreeBuilder<>();
        
        // 构建树,传入实体列表及提取ID和父ID的函数
        TreeNode<Entity> tree = treeBuilder.buildTree(
            entities,
            Entity::getId,        // 提取ID
            Entity::getParentId   // 提取父ID
        );
 
        // 打印树结构
        printTree(tree, 0);
    }
 
    // 递归打印树结构的辅助方法
    private static void printTree(TreeNode<Entity> node, int level) {
        if (node == null) return; // 如果节点为空,直接返回
 
        // 打印当前节点的名称,缩进显示层级
        System.out.println("  ".repeat(level) + node.getData().getName());
        
        // 递归打印所有子节点
        for (TreeNode<Entity> child : node.getChildren()) {
            printTree(child, level + 1);
        }
    }
}

代码注释说明:

Entity类:每个字段和方法都有注释,说明其用途和功能。

Main类

  • 实体列表中每个节点的构造都有注释,解释其层级关系。
  • 构建树的步骤清晰描述,便于理解。

printTree方法:详细说明其递归逻辑和输出格式。

到此这篇关于Java实现公用实体类转Tree结构的文章就介绍到这了,更多相关Java公用实体类转Tree结构内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java e.printStackTrace()案例讲解

    Java e.printStackTrace()案例讲解

    这篇文章主要介绍了Java e.printStackTrace()案例讲解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • 详解MyBatis逆向工程

    详解MyBatis逆向工程

    本篇文章主要介绍了详解MyBatis逆向工程,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01
  • mybatis中的字符串拼接问题

    mybatis中的字符串拼接问题

    这篇文章主要介绍了mybatis中的字符串拼接问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • 解决MyBatis中为类配置别名,列名与属性名不对应的问题

    解决MyBatis中为类配置别名,列名与属性名不对应的问题

    这篇文章主要介绍了解决MyBatis中为类配置别名,列名与属性名不对应的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • springboot使用Logback把日志输出到控制台或输出到文件

    springboot使用Logback把日志输出到控制台或输出到文件

    这篇文章给大家介绍springboot项目使用日志工具Logback把日志不仅输出到控制台,也可以输出到文件的操作方法,本文通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2020-10-10
  • springboot+mybatis+枚举处理器的实现

    springboot+mybatis+枚举处理器的实现

    在Spring boot项目开发中经常遇到需要使用枚举的场景,本文就介绍了springboot+mybatis+枚举处理器的实现,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • java遍历读取整个redis数据库实例

    java遍历读取整个redis数据库实例

    这篇文章主要介绍了java遍历读取整个redis数据库实例,使用支持正则表达式的key搜索方法jedis.keys(“*”)实现,需要的朋友可以参考下
    2014-05-05
  • java计算集合对称差的示例代码

    java计算集合对称差的示例代码

    本篇文章主要介绍了java计算集合对称差的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • 手把手教你搞懂冒泡排序和选择排序

    手把手教你搞懂冒泡排序和选择排序

    这篇文章主要介绍了java数组算法例题代码详解(冒泡排序,选择排序),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-07-07
  • 详解Java LinkedHashMap与HashMap的使用

    详解Java LinkedHashMap与HashMap的使用

    这篇文章主要通过几个示例为大家详细介绍了Java中LinkedHashMap与HashMap的常见使用和概述,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2022-10-10

最新评论