天天看點

[遞歸+通路者模式]實作樹狀結構的節點周遊處理

/**
     * 把嵌套樹結構 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 開發者社群

繼續閱讀