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中的SynchronousQueue阻塞队列及使用场景解析

    Java中的SynchronousQueue阻塞队列及使用场景解析

    这篇文章主要介绍了Java中的SynchronousQueue阻塞队列及使用场景解析,SynchronousQueue 是 Java 中的一个特殊的阻塞队列,它的主要特点是它的容量为0,这意味着 SynchronousQueue不会存储任何元素,需要的朋友可以参考下
    2023-12-12
  • springboot控制层图片验证码生成

    springboot控制层图片验证码生成

    这篇文章主要为大家详细介绍了springboot控制层图片验证码生成,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • idea项目debug模式启动,断点失效,断点红点内无对勾问题及解决

    idea项目debug模式启动,断点失效,断点红点内无对勾问题及解决

    这篇文章主要介绍了idea项目debug模式启动,断点失效,断点红点内无对勾问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-10-10
  • Struts 2 数据校验功能及校验问题的解决方案

    Struts 2 数据校验功能及校验问题的解决方案

    这篇文章主要介绍了Struts 2 数据校验功能及校验问题的解决方案的相关资料,需要的朋友可以参考下
    2016-09-09
  • Spring Boot 2.0快速构建服务组件全步骤

    Spring Boot 2.0快速构建服务组件全步骤

    这篇文章主要给大家介绍了关于Spring Boot 2.0快速构建服务组件的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Spring Boot 2.0具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-04-04
  • Java实现求二叉树的深度和宽度

    Java实现求二叉树的深度和宽度

    这篇文章主要介绍了Java实现求二叉树的深度和宽度,本文分别给出代码实例,需要的朋友可以参考下
    2015-06-06
  • 使用BindingResult 自定义错误信息

    使用BindingResult 自定义错误信息

    这篇文章主要介绍了使用BindingResult 自定义错误信息,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • Java使用POI导出Excel(一):单sheet

    Java使用POI导出Excel(一):单sheet

    这篇文章介绍了Java使用POI导出Excel的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-10-10
  • Java泛型最全知识总结

    Java泛型最全知识总结

    面试被问到Java泛型怎么办,有了这篇文章,让你直接保送,文中有非常详细的知识总结及相关代码示例,需要的朋友可以参考下
    2021-06-06
  • idea2022创建javaweb项目步骤(超详细)

    idea2022创建javaweb项目步骤(超详细)

    本文主要介绍了idea2022创建javaweb项目步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07

最新评论