如何在 Java 中递归构建嵌套的 Person 模型树结构

聖光之護

聖光之護

2026-07-08

290人浏览

原创

如何在 Java 中递归构建嵌套的 Person 模型树结构

本文介绍如何通过递归遍历任意深度的嵌套人员数据(含 name、age、children),将其转换为结构一致的 Person 对象树,确保每个节点的 children 字段正确引用其子节点列表。

本文介绍如何通过递归遍历任意深度的嵌套人员数据(含 name、age、children),将其转换为结构一致的 `person` 对象树,确保每个节点的 `children` 字段正确引用其子节点列表。

在处理具有层级关系的嵌套数据(如家谱、组织架构或评论回复链)时,Java 中最自然且可靠的建模方式是递归构造对象树。核心思想是:对每个 Person 实例,先创建自身,再对其 children 字段递归调用相同逻辑——即“创建当前节点 → 递归构建子树 → 组装父子关系”。

以下是一个完整、可直接落地的实现方案:

✅ 定义清晰的 Person 模型类

static class Person {
    String name;
    int age;
    List<person> children;

    // 无子节点构造器
    Person(String name, int age) {
        this.name = name;
        this.age = age;
        this.children = null; // 显式设为 null,语义更清晰
    }

    // 带子节点构造器(推荐用于反序列化)
    Person(String name, int age, List<person> children) {
        this.name = name;
        this.age = age;
        this.children = children;
    }
}</person></person>

⚠️ 注意:children 字段应允许为 null(表示无子节点),而非空 List —— 这能准确反映原始数据语义,并避免冗余对象创建。

Java JDK 25
Java JDK 25

Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。

下载

✅ 递归构建方法(关键逻辑)

// 全局容器:存储所有已构建的 Person 实例(按需保留)
private final List<person> allPersons = new ArrayList();

/**
 * 递归遍历并构建 Person 树
 * @param persons 当前层级的 Person 列表(可能为空或 null)
 */
private void buildPersonTree(List<person> persons) {
    if (persons == null || persons.isEmpty()) return;

    for (Person person : persons) {
        // 1. 将当前 person 加入全局列表(如需扁平化访问)
        allPersons.add(person);

        // 2. 递归构建其子树
        if (person.children != null) {
            buildPersonTree(person.children);
        }
    }
}</person></person>

✅ 在 API 回调中集成构建流程

private void loadPersons(String id) {
    ListPersonsApi.Request request = Jso.create();
    request.id = id;

    dispatcher.send(ListPersonsApi.PATH, request, r -> {
        // 步骤1:将原始 API 数据映射为 Person 对象树(保持嵌套结构)
        List<person> rootPersons = new ArrayList();
        for (ListPersonsApi.Person apiPerson : r.persons) {
            // 递归转换 children 字段(关键!)
            List<person> convertedChildren = convertChildren(apiPerson.children);
            rootPersons.add(new Person(apiPerson.name, apiPerson.age, convertedChildren));
        }

        // 步骤2:启动递归构建,填充 allPersons 并建立完整树形关系
        buildPersonTree(rootPersons);
    });
}

// 辅助方法:将 API 的 children 数组递归转为 Person 列表
private List<person> convertChildren(List<listpersonsapi.person> apiChildren) {
    if (apiChildren == null || apiChildren.isEmpty()) return null;

    List<person> children = new ArrayList();
    for (ListPersonsApi.Person child : apiChildren) {
        List<person> grandChildren = convertChildren(child.children);
        children.add(new Person(child.name, child.age, grandChildren));
    }
    return children;
}</person></person></listpersonsapi.person></person></person></person>

✅ 使用示例与验证

假设 API 返回如下 JSON 结构:

{
  "persons": [
    {"name":"John","age":18,"children":null},
    {"name":"Lisa","age":32,"children":[{"name":"Tyler","age":7,"children":null}]},
    {"name":"Mike","age":90,"children":[{"name":"Derek","age":50,"children":[{"name":"Mary","age":25,"children":null},{"name":"Beth","age":16,"children":null}]}]}]
}

执行后,allPersons 将包含 7 个 Person 实例,且 Mike.children.get(0).children 正确指向包含 Mary 和 Beth 的列表,形成完整树形引用链。

? 关键注意事项

  • 避免循环引用:确保原始数据无环(如 A 的孩子是 B,B 的孩子又包含 A),否则递归会栈溢出;
  • 空值防御:始终检查 children == null 而非 children.isEmpty(),因 null 表示“无子节点”,空列表则表示“有子节点但为空”;
  • 内存考量:若仅需树形结构而无需扁平列表,可移除 allPersons,直接返回根节点列表;
  • 性能提示:对于超深嵌套(>1000 层),考虑改用栈模拟递归以防 StackOverflowError,但日常业务场景中递归完全足够。

通过这一设计,你获得了可读性强、扩展性好、且与原始数据结构严格对齐的领域模型,为后续渲染、搜索或编辑提供了坚实基础。

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

java

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

3912

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

2863

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

2901

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

638

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

603

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

728

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1338

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

18866

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

647

8

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

Java 26官方文档
Java 26官方文档

共0课时 | 0人学习