/**
* 把嵌套樹結構 Tree 轉成 Graph 圖結構
*
* @param tree Tree
* @return Graph
*/
public static GraphVO tree2graph(ItemVO tree) {
List<EdgeDO> edgeList = new ArrayList<>();
buildEdges(tree, edgeList);
final List<ItemVO> nodeList = new ArrayList<>();
visitTree(tree, t -> {
ItemVO node = new ItemVO();
BeanUtils.copyProperties(t, node);
// 圖節點,children 置為空
node.children = new ArrayList<>();
nodeList.add(node);
});
GraphVO graph = new GraphVO();
graph.setEdgeList(edgeList);
graph.setItemList(nodeList);
return graph;
}
/**
* 通路者模式,遞歸周遊樹節點
*
* @param t 樹節點
* @param visitor 通路者
*/
private static void visitTree(ItemVO t, TreeVisitor visitor) {
visitor.visit(t);
if (null != t.children) {
for (ItemVO child : t.children) {
visitTree(child, visitor);
}
}
}
Kotlin 開發者社群