ツリー構造の Java 実装サンプル

以前の続き。

動的にデータを取得する 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;
}

これはグラフデータの探索で言うところの 深さ優先探索 になっている。深さ優先探索の場合、縦方向 (深い階層) の探索を優先する。ちなみに、幅優先探索の場合は横方向 (隣接する要素) の探索を優先する。