【问题标题】:How to display list data in tree structure in Java?如何在 Java 中以树状结构显示列表数据?
【发布时间】:2018-10-10 06:29:02
【问题描述】:

我有一个 arrayList,我想以分层结构显示。

我希望结果看起来像这样。如果它没有任何子节点,我希望项目用连字符缩进:

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

我正在尝试使用递归方法显示列表,但没有得到想要的结果。这是我迄今为止尝试过的:

import java.util.*;

class Materials {
    public int id;
    public String content;
    public int pid; 

    public Materials(int id, String content, int pid) {
        this.id = id;
        this.content = content;
        this.pid = pid; 
    }
}
public class nestedList {

public static ArrayList<Materials> material;

public static void main(String[] args) {
    material = new ArrayList<Materials>();
    material.add(new Materials(1,"User Design", 0));
    material.add(new Materials(2,"Lectures", 1));
    material.add(new Materials(3,"Activities", 1));
    material.add(new Materials(4,"Week 1", 2));
    material.add(new Materials(5,"Apr 5", 4));
    material.add(new Materials(6,"Apr 8", 4));
    material.add(new Materials(7,"Week 2", 2));
    material.add(new Materials(8,"Apr 12", 7));
    material.add(new Materials(9,"Personas", 3));
    material.add(new Materials(10,"Male", 9));
    material.add(new Materials(11,"Female", 9));
    material.add(new Materials(12,"George", 10));
    material.add(new Materials(13,"Allison", 11));
    material.add(new Materials(14,"Jessica", 11));

    displayContent(material);

}

static void displayContent(ArrayList<Materials> materials) {
    ArrayList<Materials> childs = new ArrayList<Materials>();
    for (Materials material : materials) {
        childs = selectChild(material.id);
        System.out.println(material.content);
        displayContent(childs);
    }

}

static ArrayList<Materials> selectChild(int id) {
    ArrayList<Materials> list = new ArrayList<Materials>();

    for (int i = 0; i < material.size(); i++) {
        if(material.get(i).pid == id) {
            list.add(material.get(i));
        }
    }

    return list;
}
}

当我运行此代码时,arrayList 中的项目重复了太多次。它最初显示正确的层次结构,然后开始以随机变化重复。

谁能指点我正确的方向?

【问题讨论】:

  • 我认为 List 不适合层次结构
  • 给了我一份 N 个材料的清单。你会推荐我使用什么数据结构?
  • @Dukeling,谢谢。我的答案中提到的标签计数可以由该答案管理。
  • 那么你的问题是什么?你遇到的具体问题是什么?如所写,您的问题太宽泛了。

标签: java arraylist data-structures tree hierarchical-data


【解决方案1】:

问题在于,在您第一次调用displayContent 时,您传递了整个材料列表。所以它会这样做:

Display the entire hierarchy for "User Design"
Display the entire hierarchy for "Lectures"
Display the entire hierarchy for "Activities"
etc.

您真正想要做的是在您的初始调用中仅将根元素传递给displayContent。所以在你的主要:

ArrayList<Materials> topLevel = selectChild(0);
displayContent(topLevel);

【讨论】:

  • 哦,有道理!我决定尝试一个不同的测试用例,其中“用户设计”不再是根元素,但“讲座”和“活动”的 parentID 都是“0”。如何在不对 displayContent 进行 2 次单独调用的情况下同时显示两者?
  • 我展示的代码会做到这一点。它使用您的 selectChild 函数获取所有 parentID 为 0 的元素。只需将该列表传递给 displayContent 方法即可。
【解决方案2】:
static void displayContent(ArrayList<Materials> materials) {
    ArrayList<Materials> childs = new ArrayList<Materials>();
    for (Materials material : materials) {
        childs = selectChild(material.id);
        if(childs.isEmpty()) {
            System.out.print(" - ");
        }
        System.out.println(material.content);
        displayContent(childs);
    }

}

在打印材料内容之前检查列表是否为空将为最后一个元素添加 -。

对于系统选项卡,您必须计算遍历次数(例如,child of child 的 child 为 3)并添加那么多选项卡。 This answer 可以提供帮助。感谢杜克林指出。

【讨论】:

  • 谢谢!但是我仍然对 arrayList 中的项目重复太多次这一事实有疑问。它最初显示正确的层次结构,然后开始以随机变化重复。有什么想法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 2020-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-07
  • 1970-01-01
相关资源
最近更新 更多