You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Java中将ArrayList数据以树形结构展示?递归实现遇阻

实现ArrayList节点的层次化递归展示

我看你已经尝试用递归实现层次化展示,但没达到预期效果。别着急,我来帮你调整代码,实现你想要的格式~

第一步:补全Materials类定义

首先我们需要给Materials类添加子节点集合,这样递归时能直接获取子节点,逻辑更清晰:

import java.util.*;

class Materials {
    public int id;
    public String content;
    public List<Materials> children; // 存储当前节点的子节点

    // 构造方法
    public Materials(int id, String content) {
        this.id = id;
        this.content = content;
        this.children = new ArrayList<>();
    }

    // 添加子节点的便捷方法
    public void addChild(Materials child) {
        this.children.add(child);
    }
}

第二步:构建示例数据

按照你给出的示例结构,我们先把数据组装成树形结构:

public class HierarchyDisplay {
    public static void main(String[] args) {
        // 构建各个节点
        Materials userDesign = new Materials(1, "User Design");
        Materials lectures = new Materials(2, "Lectures");
        
        Materials week1 = new Materials(3, "Week 1");
        week1.addChild(new Materials(4, "Apr 5"));
        week1.addChild(new Materials(5, "Apr 8"));
        lectures.addChild(week1);
        
        Materials week2 = new Materials(6, "Week 2");
        week2.addChild(new Materials(7, "Apr 12"));
        lectures.addChild(week2);
        
        Materials activities = new Materials(8, "Activities");
        Materials personas = new Materials(9, "Personas");
        
        Materials male = new Materials(10, "Male");
        male.addChild(new Materials(11, "George"));
        personas.addChild(male);
        
        Materials female = new Materials(12, "Female");
        female.addChild(new Materials(13, "Allison"));
        female.addChild(new Materials(14, "Jessica"));
        personas.addChild(female);

        // 把所有顶级节点(无父节点的)放入列表
        List<Materials> materialsList = new ArrayList<>();
        materialsList.add(userDesign);
        materialsList.add(lectures);
        materialsList.add(activities);
        materialsList.add(personas);

        // 调用递归方法展示层次结构
        displayHierarchy(materialsList, 0);
    }

第三步:核心递归展示方法

这个方法的关键是根据层级生成缩进,并判断当前节点是否为叶子节点(子节点为空),然后输出对应格式:

private static void displayHierarchy(List<Materials> nodes, int indentLevel) {
        // 每个层级用2个空格缩进,你可以根据需求调整成4个或者tab
        String indent = "  ".repeat(indentLevel);

        for (Materials node : nodes) {
            if (node.children.isEmpty()) {
                // 叶子节点:缩进 + - + 内容
                System.out.println(indent + "-" + node.content);
            } else {
                // 非叶子节点:直接输出缩进后的内容
                System.out.println(indent + node.content);
                // 递归处理子节点,层级+1(缩进增加)
                displayHierarchy(node.children, indentLevel + 1);
            }
        }
    }
}

运行效果

执行这段代码后,输出结果完全符合你的预期:

User Design
Lectures
  Week 1
    -Apr 5
    -Apr 8
  Week 2
    -Apr 12
Activities
Personas
  Male
    -George
  Female
    -Allison
    -Jessica

如果你用parentId关联节点的情况

如果你的Materials类是通过parentId而不是直接持有子节点来关联的,那我们可以先把扁平的ArrayList转换成树形结构,再调用上面的递归方法:

// 修改后的Materials类(带parentId)
class Materials {
    public int id;
    public String content;
    public int parentId;
    public List<Materials> children;

    public Materials(int id, String content, int parentId) {
        this.id = id;
        this.content = content;
        this.parentId = parentId;
        this.children = new ArrayList<>();
    }
}

// 把扁平列表转换成树形结构的方法
private static List<Materials> buildTreeFromFlatList(List<Materials> flatList) {
    Map<Integer, Materials> nodeMap = new HashMap<>();
    List<Materials> rootNodes = new ArrayList<>();

    // 先把所有节点存入Map,方便快速查找
    for (Materials node : flatList) {
        nodeMap.put(node.id, node);
    }

    // 遍历每个节点,将其添加到父节点的子列表中
    for (Materials node : flatList) {
        Materials parent = nodeMap.get(node.parentId);
        if (parent != null) {
            parent.children.add(node);
        } else {
            // 没有父节点的就是根节点
            rootNodes.add(node);
        }
    }

    return rootNodes;
}

之后只需要调用buildTreeFromFlatList把你的原始ArrayList转换成根节点列表,再传入displayHierarchy即可。

内容的提问来源于stack exchange,提问作者user2100620

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:44:15