当前位置: 代码网 > it编程>编程语言>Java > Java实现公用实体类转Tree结构

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

2024年10月28日 Java 我要评论
工具类import java.util.*;import java.util.function.function;import java.util.stream.collectors; // 树节点类

工具类

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结构内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com