Как рекурсивно печатать иерархические списки с отступами - PullRequest
0 голосов
/ 26 февраля 2020

У меня есть класс, который состоит из имени String и ArrayList других экземпляров класса, известных как вложения. Думайте об этом как о go, который может быть присоединен к бесконечно многим другим легосам. Мне нужно отобразить эту иерархию в консоли с отступами (без передачи каких-либо параметров), и я не уверен, что лучший способ сделать это:

Ожидаемый вывод:

+ PowerSource
    + Appliance
         + Extension
         + Module
    + Lamp
    + Appliance
         + Module

Текущий вывод :

+ PowerSource
    + Appliance
    + Extension
    + Module
    + Lamp
    + Appliance
    + Module

У меня есть метод display() до такой степени, что я могу сделать отступ один раз, но тогда я не могу получить вложения вложений к отступу дважды. Любая помощь будет оценена

package components;

import java.util.ArrayList;
import java.util.List;

public class MyTest {

    private String name;
    private List<MyTest> attachments;

    public MyTest(String name) {
        this.name = name;
        attachments = new ArrayList<MyTest>();
    }

    public void attach(MyTest newLoad) {
        attachments.add(newLoad);
    }

    public void display() {
        System.out.print("+ " + toString() + "\n");
        if (attachments.size() > 0) {
            for (MyTest load : attachments) {
                System.out.print("    ");
                load.display();
            }
        }
    }

    @Override
    public String toString() {
      return name;
    }

    public static void main(String[] args) {
        MyTest a = new MyTest("PowerSource");
        a.attach(new MyTest("Appliance"));
        a.attach(new MyTest("Appliance"));
        MyTest l = new MyTest("Lamp");
        l.attach(new MyTest("Extension"));
        a.attach(l);

        a.display();
    }
}

Ответы [ 2 ]

2 голосов
/ 26 февраля 2020

Передавайте префикс в качестве параметра:

public void display() {
    display("");
}

private void display(String prefix) {
    System.out.println(prefix + "+ " + name);
    for (MyTest load : attachments) {
        load.display(prefix + "    ");
    }
}

Обратите внимание, что if (attachments.size() > 0) не требуется, поскольку l oop просто ничего не сделает, если attachments пусто.

1 голос
/ 26 февраля 2020

это нормально. когда выполняется рекурсивный вызов, программа не знает, сколько отступов нужно сделать. это всегда делает один отступ. Программа должна знать глубину иерархии вашего списка.

Я имею в виду, когда устройство вызывает свой дисплей, оно должно делать отступ два раза. потому что их элементы должны быть двойными. но у него нет этой информации.

, поэтому вы можете создать поле int глубины = 0; для базового объекта. и отредактируйте присоединение следующим образом.

public void attach(MyTest newLoad) {
    newLoad.setDepth(this.depth + 1);
    attachments.add(newLoad);
}

затем отредактируйте метод отображения следующим образом и добавьте метод отступа.

private void indent(int depth){
   if(depth > 0){
        System.out.print("    ");
        indent(depth-1);
    }
}
public void display() {
    System.out.print("+ " + toString() + "\n");
    for (MyTest load : attachments) {
         this.indent(this.depth);
         load.display();
    }
 }

Я не проверял это, но вы получите основную идею из этих примеры

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...