У меня есть список с некоторыми таблицами из базы данных, где каждая строка содержит родительское поле, ссылающееся на другую строку. Как это
заголовок, родитель
A, ноль
Б, А
С, А
D, C
E, B
F, ноль
Здесь A и F являются корневыми узлами, B и C являются дочерними по отношению к A, D является дочерними по отношению к C, а E является дочерними по отношению к B.
Каков наилучший способ получить древовидную структуру из этого списка?
Один из способов состоит в том, чтобы пройтись по списку, находя корень (заголовок без родителей), затем для каждого корня снова выполнить цикл по списку и присоединить узлы корней. Затем для этих узлов снова выполните цикл по полному списку, чтобы присоединить любых собственных дочерних элементов.
Пример:
private Node getNode(SomeData d) {
List<SomeData> tmp = getChildren(d);
if (tmp == null OR empty) return new Node(d);
Node n = new Node(d);
for (SomeData m : tmp) {
n.addChild(getNode(m)); // recurse
}
return n;
}
private List<SomeData> getChildren(SomeData parent) {
List<SomeData> tmp = new ArrayList<SomeData>();
for (SomeData candidateChild : myBigFlatDataList.values()) {
if (parent.equals(candidateChild)) {
tmp.add(candidateChild);
}
}
return tmp;
}
Есть ли лучший способ сделать это?