使用遞歸操作將父子關系數據轉成樹形結構對象


實際工作中,經常遇到要將有父子關系的數據庫表轉成Java對象,這里就以集團公司的行政結構為例,采用遞歸算法解決這個場景的問題,有什么錯誤的地方,還希望大家批評指正。

數據准備

為了簡單起見,就不搞數據庫了,直接在代碼中造數據模擬,其中TreeNode類在后面有寫。如下:

list.add(new TreeNode(0, null, "大集團"));
list.add(new TreeNode(1, 0, "科技公司"));
list.add(new TreeNode(2, 0, "文化傳媒公司"));
list.add(new TreeNode(3, 0, "武昌辦事處"));
list.add(new TreeNode(4, 0, "漢口辦事處"));
list.add(new TreeNode(5, 1, "研發中心"));
list.add(new TreeNode(6, 1, "行政部"));
list.add(new TreeNode(7, 5, "技術部"));
list.add(new TreeNode(8, 5, "產品部"));
list.add(new TreeNode(9, 5, "運維部"));
list.add(new TreeNode(10, 2, "創作部"));
list.add(new TreeNode(11, 2, "行政部"));

代碼實現

不多說了,直接上代碼,比較簡單。

TreeNode類,表示數據節點:

@Getter
@Setter
public class TreeNode {

    private Integer id;
    private Integer parentId;
    private String name;
    private List<TreeNode> childNodes;

    public TreeNode(Integer id, Integer parentId, String name) {
        this.id = id;
        this.parentId = parentId;
        this.name = name;
        this.childNodes = new ArrayList<>();
    }
}

TreeNodeUtils類,主要實現邏輯都在這里面:

public class TreeNodeUtils {

    private List<TreeNode> treeNodeList;

    public TreeNodeUtils(List<TreeNode> treeNodeList) {
        this.treeNodeList = treeNodeList;
    }

    /**
     * 生成以id為根節點的樹
     *
     * @param id
     * @return
     */
    public TreeNode generateTree(int id) {
        TreeNode root = getById(id);
        List<TreeNode> childNodes = getChildrenById(id);
        if (childNodes != null && childNodes.size() > 0) {
            for (TreeNode node : childNodes) {
                // 將子節點作為根,查找子節點的子節點
                TreeNode childRoot = generateTree(node.getId());
                root.getChildNodes().add(childRoot);
            }
        }

        return root;
    }

    /**
     * 根據id查找節點
     *
     * @param id
     * @return
     */
    private TreeNode getById(int id) {
        for (TreeNode node : treeNodeList) {
            if (node.getId() == id) {
                return node;
            }
        }

        return null;
    }

    /**
     * 根據id查找所有的子節點
     *
     * @param id
     * @return
     */
    private List getChildrenById(int id) {
        List<TreeNode> childNodes = new ArrayList<>();
        for (TreeNode node : treeNodeList) {
            if (node.getParentId() != null && node.getParentId() == id) {
                childNodes.add(node);
            }
        }

        return childNodes;
    }
}

測試

用前面准備的數據作為數據源來測試:

public class TreeNodeTest {

    public static void main(String[] args) {
        List<TreeNode> data = initData();
        TreeNodeUtils treeNodeUtils = new TreeNodeUtils(data);
        TreeNode root = treeNodeUtils.generateTree(0);
        System.out.println(JSON.toJSONString(root));
    }

    private static List<TreeNode> initData() {
        List<TreeNode> list = new ArrayList<>();
        list.add(new TreeNode(0, null, "大集團"));
        list.add(new TreeNode(1, 0, "科技公司"));
        list.add(new TreeNode(2, 0, "文化傳媒公司"));
        list.add(new TreeNode(3, 0, "武昌辦事處"));
        list.add(new TreeNode(4, 0, "漢口辦事處"));
        list.add(new TreeNode(5, 1, "研發中心"));
        list.add(new TreeNode(6, 1, "行政部"));
        list.add(new TreeNode(7, 5, "技術部"));
        list.add(new TreeNode(8, 5, "產品部"));
        list.add(new TreeNode(9, 5, "運維部"));
        list.add(new TreeNode(10, 2, "創作部"));
        list.add(new TreeNode(11, 2, "行政部"));
        return list;
    }
}

最后看下執行結果,Json格式化后如下:

{
    "childNodes":[
        {
            "childNodes":[
                {
                    "childNodes":[
                        {
                            "childNodes":[],
                            "id":7,
                            "name":"技術部",
                            "parentId":5
                        },
                        {
                            "childNodes":[],
                            "id":8,
                            "name":"產品部",
                            "parentId":5
                        },
                        {
                            "childNodes":[],
                            "id":9,
                            "name":"運維部",
                            "parentId":5
                        }
                    ],
                    "id":5,
                    "name":"研發中心",
                    "parentId":1
                },
                {
                    "childNodes":[],
                    "id":6,
                    "name":"行政部",
                    "parentId":1
                }
            ],
            "id":1,
            "name":"科技公司",
            "parentId":0
        },
        {
            "childNodes":[
                {
                    "childNodes":[],
                    "id":10,
                    "name":"創作部",
                    "parentId":2
                },
                {
                    "childNodes":[],
                    "id":11,
                    "name":"行政部",
                    "parentId":2
                }
            ],
            "id":2,
            "name":"文化傳媒公司",
            "parentId":0
        },
        {
            "childNodes":[],
            "id":3,
            "name":"武昌辦事處",
            "parentId":0
        },
        {
            "childNodes":[],
            "id":4,
            "name":"漢口辦事處",
            "parentId":0
        }
    ],
    "id":0,
    "name":"大集團"
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM