オブジェクトのツリー構造に再帰的なデータを使用して、親と子の関係

多くの場合、あなたは親子関係を持つようにしたいデータベーステーブルに遭遇した実用的な仕事は、私も批判したい、何かが間違っている、このシナリオの問題を解決するために、再帰的なアルゴリズムを使用して、例えば、会社の管理構造にここでは、Javaオブジェクトに変身します補正。

データ準備

簡単にするために、データベースは、ツリーノードのクラスは、裏面に書かれた前記コードに直接シミュレートされたデータを作成する、係合します。次のように:

list.add(新新のTreeNode(0、nullで、 "大規模なグループ" )); 
list.add(新しい新しいツリーノード(1、0、 "テクノロジー企業" )); 
list.add(新新のTreeNode(2、0、「文化メディア会社" )); 
list.add(新新のTreeNode(3、0、"武昌オフィス" )); 
list.add(新新のTreeNode(4、0、"漢口オフィス" )); 
list.add(新新のTreeNode( 5、1、 "R&Dセンター" )); 
List.add(新しい新しいツリーノード(図6に示すように、 "管理部"。 )); 
List.add(新しい新しいツリーノード(7,5、 "技術"。 )); 
List.add (新新のTreeNode(8、5、 "製品" ));
List.add(新しい新しいツリーノード(9 ,. 5、 "操作およびメンテナンスユニット"。 )); 
List.add(新しい新しいツリーノード(10、2、 "書込部" )); 
List.add(新しい新しいツリーノード(11、2、 "管理"。)) ;

コードの実装

直接コードで、言っても過言ではないでは比較的簡単です。

ツリーノードのデータノードを表すクラス:

@Getter 
@Setter 
パブリック クラスツリーノード{ 

    プライベート整数ID。
    プライベート整数PARENTID。
    プライベート文字列名;
    プライベートリスト<のTreeNode> のchildNodes。

    公共のTreeNode(整数ID、整数PARENTID、文字列名){
         この .ID = ID。
        この .parentId = PARENTID。
        この .nameの= 名前;
        この .childNodes = 新しい ArrayListを<> (); 
    } 
}

TreeNodeUtilsのクラス、そこでのロジックの主な成果:

パブリック クラスTreeNodeUtils { 

    プライベートリスト<のTreeNode> treeNodeList。

    公共 TreeNodeUtils(一覧<ツリーノード> treeNodeList){
         この .treeNodeList = treeNodeList。
    } 

    / ** 
     *生成以ID为根节点的树
     * 
     * @paramのID 
     * @return 
     * / 
    公共のTreeNode generateTree(int型のID){ 
        ツリーノードのルート = getById(ID)。
        リスト <ツリーノード>のchildNodes = getChildrenById(ID)。
        もし(のchildNodes!= nullをChildNodes.size &&()> 0 ){
             ため:(ツリーノードのノードのchildNodes){
                 // 子ノードがルートとして、子ノードの子が検索 
                ツリーノードchildRoot = )generateTree(node.getId(); 
                root.getChildNodesを()。追加(childRoot); 
            } 
        } 

        戻りルートを; 
    } 

    / ** 
     *検索ノードID 
     * 
     * @paramのID 
     * @return 
     * / 
    プライベートツリーノードgetById(int型のID){
         (ツリーノードのノード:treeNodeList){
             IF(node.getId ()==ID){
                 戻りノード。
            } 
        } 

        戻り ヌル
    } 

    / ** 
     *根据ID查找所有的子节点
     * 
     * @paramのID 
     * @return 
     * / 
    プライベートリストgetChildrenById(int型のID){ 
        リスト <ツリーノード>のchildNodes = 新規のArrayList <> ();
        {(treeNodeListツリーノードのノード)
             であれば(node.getParentId()!= NULL && node.getParentId()== ID){  
                childNodes.add(ノード)。
            } 
        }

        戻りのchildNodesを、
    } 
}

テスト

データソース試験上記のように調製したデータ:

パブリック クラスTreeNodeTest { 

    公共 静的 ボイドメイン(文字列[]引数){ 
        リスト <ツリーノード>データ= initData()。
        TreeNodeUtils treeNodeUtils = 新しいTreeNodeUtils(データ)。
        ツリーノードのルート = treeNodeUtils.generateTree(0 )。
        System.out.println(JSON.toJSONString(ルート))。
    } 

    プライベート 静的リスト<ツリーノード> initData(){ 
        リスト <ツリーノード>リスト= 新規のArrayList <> (); 
        list.add(新しいツリーノード(0、nullで、 "大集团")); 
        List.add(新しい新しいツリーノード(1、0、 "テクノロジー企業" )); 
        list.add(新新のTreeNode(2、0、 "メディア企業文化" )); 
        list.add(新新のTreeNode(3、0 "武昌オフィス" )); 
        List.add(新しい新しいツリーノード(4,0、 "漢口オフィス"。 )); 
        List.add(新しい新しいツリーノード(5 ,. 1、 "R&Dセンター"。 )); 
        List.add(新しい新しいツリーノード(6 ,. 1、 "管理手段"。 )); 
        List.add(新しい新しいツリーノード(7 ,. 5、 "技術"。 )); 
        List.add(新しい新しいツリーノード(8 ,. 5、 "製品" )); 
        リスト。(追加新しいですツリーノード(9、5、 "操作及びメンテナンスユニット" )); 
        List.add(新しい新しいツリーノード(10、2、 "書込部" )); 
        List.add(新しい新しいツリーノード(11、2、 "管理"。 ));
         返すリスト; 
    } 
}

最終的な外観、次のようにフォーマットされたJSONの結果:

{
     "のchildNodes" :[ 
        {
             "のchildNodes" :[ 
                {
                     "のchildNodes" :[ 
                        {
                             "のchildNodes" :[]、
                             "ID":7  "名前": "技术部"  "PARENTID":5 
                        }、
                        {
                             " childNodes」:[]、
                             "ID":8  "名前": "产品部"  "PARENTID":5 
                        }、
                        {
                            "のchildNodes" :[]、
                             "ID":9  "名前": "运维部"  "PARENTID":5 
                        } 
                    ]、
                     "ID":5  "名前": "研发中心"  "PARENTID": 1 
                }、
                {
                     "のchildNodes" :[]、
                     "ID":6  "名前": "行政部"  "PARENTID":1 
                } 
            ]、
             "上記ID":1  "名前": "技術会社" "PARENTID":0 
        }、
        {
             "のchildNodes" :[ 
                {
                     "のchildNodes" :[]、
                     "ID":10  "名前": "创作部"  "PARENTID":2 
                }、
                {
                     "のchildNodes" :[ ]、
                     "ID" 11  "名前": "行政部"  "PARENTID":2 
                } 
            ]、
             "ID":2  "名前":"文化メディアカンパニー" " PARENTID「:0 
        }、 
        {
            "のchildNodes" :[]、
             "ID":。3  "名前": "武昌オフィス"  "PARENTID":0 
        }、
        {
             "のchildNodes" :[]、
             "ID":。4  "名前"、「漢口オフィス" " PARENTID ":0 
        } 
    ]、 "上記ID述べ":0  "名前":"大規模なグループ" 
}
    

 

おすすめ

転載: www.cnblogs.com/zhou-920644981/p/11329095.html