Как сформировать дерево из набора данных с циклическими отношениями?
У меня есть такой класс:
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
,