實際工作中,經常遇到要將有父子關系的數據庫表轉成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":"大集團" }