2013-04-12 2 views
0

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

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 он, указывая на. За последние 6 дней Print все 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.

+0

Спасибо! Это было так просто, я не понимаю, как я сам не видел. :) – manabreak