Как отобразить данные списка в древовидной структуре в Java? - PullRequest
0 голосов
/ 30 апреля 2018

У меня есть 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 повторяются слишком много раз. Сначала отображается правильная иерархическая структура, а затем начинает повторяться со случайными вариациями.

Может кто-нибудь указать мне правильное направление?

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018

Проблема в том, что при первом вызове 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);
0 голосов
/ 30 апреля 2018
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 of 3 - child) и добавить столько вкладок. Этот ответ может помочь с этим. Спасибо Dukeling за указание на это.

...