Я пытаюсь отобразить древовидную структуру в таблице и никак не могу разобраться с последним битом.
У меня довольно стандартный класс узлов (для ясности удалены методы и конструкторы),
public class TreeNode<T> {
private TreeNode<?> parent;
private T data;
private List<TreeNode<?>> children = new ArrayList<>();
}
который может быть заполнен примерно так:
TreeNode<String> grandchild1 = new TreeNode<>("Grandchild 1");
TreeNode<String> grandchild2 = new TreeNode<>("Grandchild 2");
TreeNode<String> grandchild3 = new TreeNode<>("Grandchild 3");
TreeNode<String> child1 = new TreeNode<>("Child 1");
child1.addChild(grandchild1);
child1.addChild(grandchild2);
TreeNode<String> child2 = new TreeNode<>("Child 2");
child2.addChild(grandchild3);
TreeNode<String> root = new TreeNode<>("Root");
root.add(child1);
root.add(child2);
Чтобы напечатать эти данные в таблице, я хотел бы заполнить структуру вложенного списка следующим образом:
[["Root", "Child 1", "Grandchild 1"],
["", "", "Grandchild 2"],
["", "Child 2", "Grandchild 3"]]
так что данные «сглаживаются» и не повторяются, поэтому позже я смогу распечатать их в виде таблицы:
| Root | Child 1 | Grandchild 1 |
| | | Grandchild 2 |
| | Child 2 | Grandchild 3 |
Вот что я пробовал до сих пор:
public List<List<String>> getData(TreeNode<?> root) {
List<List<String>> data = new ArrayList<>();
getData(data, root);
return data;
}
private void getData(List<List<String>> data, TreeNode<?> node) {
if (!node.isLeaf()) {
for (TreeNode<?> child : node.getChildren()) {
getData(data, child);
}
} else {
data.add(getRow(currentNode));
}
}
private List<String> getRow(TreeNode<?> node) {
Deque<String> row = new LinkedList<>();
TreeNode<?> currentNode = node;
while (!currentNode.isRoot()) {
row.addFirst(String.valueOf(currentNode.getData()));
currentNode = currentNode.getParent();
}
return new ArrayList<>(row);
}
Хотя это рекурсивно собирает данные для отображения, очевидно, что данные будут повторяться, так как для каждой строки печатается их родительское значение, и я получу следующее:
[["Root", "Child 1", "Grandchild 1"],
["Root", "Child 1", "Grandchild 2"],
["Root", "Child 2", "Grandchild 3"]]
То, с чем я борюсь, - это способ решить, следует ли печатать (повторять) определенное значение или нет, так как я уверен, что должно быть элегантное решение.
Нет никаких гарантий относительно размера или структуры дерева, поэтому наиболее универсальное решение будет лучшим. Любая помощь будет принята с благодарностью!