以前の続き。
動的にデータを取得する Vue.js のツリーコンポーネント - kntmr-blog
これに関連して、フォルダ階層のようなツリー構造を Java で実装したサンプル。
kntmr/playground/folder-tree-examples - GitHub
子階層の要素を同じ型の List<T>
で持つことでツリー構造を表現する。
public class FolderTree { private long id; private String name; private List<FolderTree> children; public FolderTree(long id, String name) { this.id = id; this.name = name; } public long getId() { return id; } public String getName() { return name; } public List<FolderTree> getChildren() { return children; } public void setChildren(List<FolderTree> children) { this.children = children; } }
ツリー全体のデータを取得するときは最上位から順番に子階層の要素を取得する。
public FolderTree folderTree() { FolderTree tree = new FolderTree(0, "Root"); // 最上位から return getFolderTreeRecursive(tree, tree); } FolderTree getFolderTreeRecursive(FolderTree tree, FolderTree currentNode) { List<FolderTree> children = getChildren(currentNode.getId()); // 子階層を取得 currentNode.setChildren(children); for (FolderTree nextNode : children) { getFolderTreeRecursive(tree, nextNode); // 子階層の要素に対して再帰的に処理する } return tree; }
これはグラフデータの探索で言うところの 深さ優先探索 になっている。深さ優先探索の場合、縦方向 (深い階層) の探索を優先する。ちなみに、幅優先探索の場合は横方向 (隣接する要素) の探索を優先する。