データの階層構造を効率的に構築するためのJava実装を説明します。階層データをツリー形式に変換し、フロントエンドでレンダリング可能な形式を提供する方法を示します。
public class HierarchicalNode {
private String nodeId;
private String nodeName;
private String parentId;
private boolean hasChildren;
private List<HierarchicalNode> children;
// コンストラクタ・ゲッター・セッター省略
}
ツリー構造を生成するユーティリティクラスの実装:
public class TreeBuilder {
private List<HierarchicalNode> rootNodes;
private List<HierarchicalNode> allNodes;
public TreeBuilder(List<HierarchicalNode> rootList, List<HierarchicalNode> allNodes) {
this.rootNodes = rootList;
this.allNodes = allNodes;
}
public List<HierarchicalNode> buildTree() {
if (allNodes != null && !allNodes.isEmpty()) {
Map<String, Boolean> visited = new HashMap<>(allNodes.size());
rootNodes.forEach(node -> processChildren(node, visited));
return rootNodes;
}
return Collections.emptyList();
}
private void processChildren(HierarchicalNode node, Map<String, Boolean> visited) {
List<HierarchicalNode> children = new ArrayList<>();
allNodes.stream()
.filter(child -> !visited.containsKey(child.nodeId))
.filter(child -> child.parentId.equals(node.nodeId))
.forEach(child -> {
visited.put(child.nodeId, true);
processChildren(child, visited);
children.add(child);
});
node.children = children;
}
}
テストコードの実装:
public static void main(String[] args) {
HierarchicalNode root = new HierarchicalNode("A1", "本部", "ROOT", true);
HierarchicalNode branch1 = new HierarchicalNode("B2", "地域拠点", "A1", true);
HierarchicalNode branch2 = new HierarchicalNode("C3", "支店", "B2", true);
HierarchicalNode staff1 = new HierarchicalNode("S101", "店舗長", "C3", true);
HierarchicalNode staff2 = new HierarchicalNode("S102", "会計部", "C3", true);
List<HierarchicalNode> roots = Collections.singletonList(root);
List<HierarchicalNode> nodes = Arrays.asList(branch1, branch2, staff1, staff2);
TreeBuilder builder = new TreeBuilder(roots, nodes);
List<HierarchicalNode> tree = builder.buildTree();
System.out.println(new Gson().toJson(tree.get(0)));
}
生成されるJSONデータの例:
{
"nodeId": "A1",
"nodeName": "本部",
"parentId": "ROOT",
"hasChildren": true,
"children": [
{
"nodeId": "B2",
"nodeName": "地域拠点",
"parentId": "A1",
"hasChildren": true,
"children": [
{
"nodeId": "C3",
"nodeName": "支店",
"parentId": "B2",
"hasChildren": true,
"children": [
{
"nodeId": "S101",
"nodeName": "店舗長",
"parentId": "C3",
"hasChildren": true,
"children": []
},
{
"nodeId": "S102",
"nodeName": "会計部",
"parentId": "C3",
"hasChildren": true,
"children": []
}
]
}
]
}
]
}