Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中以树状结构显示列表数据?_Java_Arraylist_Data Structures_Tree_Hierarchical Data - Fatal编程技术网

如何在Java中以树状结构显示列表数据?

如何在Java中以树状结构显示列表数据?,java,arraylist,data-structures,tree,hierarchical-data,Java,Arraylist,Data Structures,Tree,Hierarchical Data,我有一个arrayList,我想以层次结构显示 我希望结果是这样的。如果它没有任何子节点,我希望该项用连字符缩进: User Design Lectures Week 1 -Apr 5 -Apr 8 Week 2 -Apr 12 Activities Personas Male -George

我有一个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;
}
}
import java.util.*;
课堂材料{
公共int id;
公共字符串内容;
公共int pid;
公共材料(int-id、字符串内容、int-pid){
this.id=id;
this.content=内容;
this.pid=pid;
}
}
公共类嵌套列表{
公共静态数组列表材料;
公共静态void main(字符串[]args){
材质=新的ArrayList();
添加(新材料(1,“用户设计”,0));
材料。增加(新材料(2,“讲座”,1));
材料。添加(新材料(3,“活动”,1));
材料。添加(新材料(4,“第1周”,第2周);
材料。添加(新材料(5,“4月5日”,4));
材料。添加(新材料(6,“4月8日”,4));
材料。添加(新材料(7,“第2周”,第2周);
材料。添加(新材料(8,“4月12日”,7));
材料。添加(新材料(9,“人物角色”,3));
材料。添加(新材料(10,“男性”,9));
材料。添加(新材料(11,“女性”,9));
材料。添加(新材料(12,“乔治”,10));
材料。添加(新材料(13,“Allison”,11));
材料。添加(新材料(14,“Jessica”,11));
显示内容(材料);
}
静态void显示内容(ArrayList材质){
ArrayList childs=新的ArrayList();
对于(材质:材质){
childs=选择child(物料id);
系统输出打印项次(物料内容);
显示内容(childs);
}
}
静态ArrayList selectChild(int id){
ArrayList=新建ArrayList();
对于(int i=0;i
当我运行这段代码时,arrayList中的项目重复了太多次。它最初显示正确的层次结构,然后开始以随机变化重复

有人能给我指一下正确的方向吗?

静态无效显示内容(ArrayList材质){
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);
    }

}
ArrayList childs=新的ArrayList(); 对于(材质:材质){ childs=选择child(物料id); if(childs.isEmpty()){ 系统输出打印(“-”); } 系统输出打印项次(物料内容); 显示内容(childs); } }
在打印材质内容之前检查列表是否为空将为最后一个元素添加-

对于系统选项卡,您必须计算遍历次数(例如,child的child的child是3)并添加那么多选项卡。我可以帮忙。感谢Dukeling指出这一点。

静态无效显示内容(ArrayList材质){
ArrayList childs=新的ArrayList();
对于(材质:材质){
childs=选择child(物料id);
if(childs.isEmpty()){
系统输出打印(“-”);
}
系统输出打印项次(物料内容);
显示内容(childs);
}
}
在打印材质内容之前检查列表是否为空将为最后一个元素添加-


对于系统选项卡,您必须计算遍历次数(例如,child的child的child是3)并添加那么多选项卡。我可以帮忙。感谢Dukeling指出这一点。

问题是,在您第一次调用
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);
ArrayList topLevel=selectChild(0);
显示内容(顶级);

问题在于,在您第一次调用
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);
ArrayList topLevel=selectChild(0);
显示内容(顶级);

我认为该列表不适用于分层结构我得到了一个包含N种材料的列表。您建议我使用什么数据结构?重复@Dukeling,谢谢。我的答案中提到的账单数量可以由这个答案来管理。那么你的问题是什么?您遇到的具体问题是什么?如前所述,你们的问题太宽泛了。我认为这个列表不适合层次结构。我得到了一个包含N种材料的列表。您建议我使用什么数据结构?重复@Dukeling,谢谢。我的答案中提到的账单数量可以由这个答案来管理。那么你的问题是什么?您遇到的具体问题是什么?如前所述,你的问题太宽泛了。谢谢你!但是我仍然有一个问题,arrayList中的项重复了太多次。它最初显示正确的层次结构,然后开始以随机变化重复。有什么想法吗?谢谢你!但是我仍然有一个问题,arrayList中的项重复了太多次。它最初显示正确的层次结构,然后开始以随机变化重复。有什么想法吗?哦,这很有道理!我决定尝试一个不同的测试用例,其中“用户设计”不再是根元素,但“讲座”和“活动”的parentID都为“0”。如何在不分别调用displayContent的情况下同时显示两者?我显示的代码将实现这一点。它使用
selectChild
函数获取parentID为0的所有元素。只需将该列表传递给
displayContent
方法。哦,这很有意义!我决定尝试一个不同的测试用例,其中“用户设计”不适用