Как сформировать дерево из набора данных с циклическими отношениями?

У меня есть такой класс:

class Foo {
    public String name = "";
    public ArrayList<Foo> children = new ArrayList<Foo>();
}

Теперь у меня есть около двух тысяч этих объектов Foo, хранящихся в ArrayList, и они связаны друг с другом, как вы можете видеть из приведенного выше фрагмента. Теперь эти отношения могут быть циклическими: у A может быть дочерний элемент B, у которого может быть дочерний элемент C, у которого может быть дочерний элемент A. Что я хочу сделать, это распечатать дерево этих отношений, игнорируя циклические отношения, например:

ObjA
  ObjB
    ObjC
ObjD
  ObjB
    ObjA

Как я могу это сделать? Это не должно быть быстрым или чем-то еще, это дерево было бы главным образом для обеспечения результатов моей программы.

1 ответ

Решение

Foo нужен print метод, который печатает его содержимое, а затем вызывает print метод Foo это указывает на. Print принимает HashSet, который содержит все Foo объекты, которые были пройдены. Если next в visited тогда это часть цикла, и вы не называете его print метод.

class Foo {
    Foo next;
    void print(HashSet<Foo> visited) {
        System.out.println("this Foo's ID or whatever it is you're printing");
        visited.add(this);
        if(next != null && !visited.contains(next)) {
            next.print(visited);
        }
    }
}

Вы также можете пройти в int параметр, определяющий уровень отступа - если indent равно 4, затем выведите 4 пробела перед System.out.printlnи приращение indent на 2 или 4 или что-то еще, когда вы звоните print на next,

Другие вопросы по тегам