J'ai une liste avec des tables d'une base de données où chaque ligne contient un champ parent se référant à une autre ligne. Comme cetteParcours n-Tree du nœud racine à tous les enfants
A
titre, parent
A, null
B, C, A
D, C
E, B
F, null
Ici A et F sont des nœuds racines, B et C sont enfants de A, D est enfant de C et E est enfant de B à son tour.
Quelle est la meilleure façon de produire une structure arborescente à partir de cette liste? L'une des façons consiste à parcourir de nouveau la liste en recherchant la racine (le titre sans parents) puis, pour chaque racine, bouclez à nouveau la liste et attachez les nœuds racines. Ensuite, pour ces nœuds, bouclez à nouveau la liste complète pour attacher les enfants qui leur sont propres.
Exemple:
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;
}
Y at-il une meilleure façon de le faire?
Je suis dans la ligne de faire comme ça mais je n'arrive pas à le comprendre, je suis trop fatigué pour aujourd'hui. – rapadura
Oui, il y a equals et hashCode dans somedata. D'où vient l'enfant à la ligne 4 juste au-dessus de parentnode.addChild (childNode); – rapadura
@AntonioP: J'ai corrigé l'exemple. C'était censé être "données". L'idée est que si vous pouvez indexer les nœuds en fonction des données qu'ils contiennent, vous pouvez rechercher le parent au moment O (1), ce qui signifie que vous pouvez construire l'arbre entier en temps linéaire/O (N). –