如何在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
相关产品推荐
相关产品推荐

