多くの場合、あなたは親子関係を持つようにしたいデータベーステーブルに遭遇した実用的な仕事は、私も批判したい、何かが間違っている、このシナリオの問題を解決するために、再帰的なアルゴリズムを使用して、例えば、会社の管理構造にここでは、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 、 "名前":"大規模なグループ" }