詳解Java構(gòu)建樹結(jié)構(gòu)的公共方法
一、前提
- pId需要傳入用來確認(rèn)第一級(jí)的父節(jié)點(diǎn),而且pId可以為null。
- 樹實(shí)體類必須實(shí)現(xiàn):TreeNode接口
- MyTreeVo必須有這三個(gè)屬性:id、pId、children
- 可以根據(jù)不同需求,配置TreeNode和MyTreeVo中固定的屬性
二、代碼
定義TreeNode接口
public interface TreeNode { String getId(); String getpId(); List getChildren(); }
需要將pId作為參數(shù)傳入,在方法中添加一個(gè)pId參數(shù),用于確認(rèn)第一級(jí)的父節(jié)點(diǎn)。
- 這個(gè)示例代碼中,buildTree方法接收兩個(gè)參數(shù),一個(gè)是泛型類型的參數(shù)List,另一個(gè)是pId,用于確認(rèn)第一級(jí)的父節(jié)點(diǎn)。在找到所有的根節(jié)點(diǎn)后,我們需要對(duì)每個(gè)根節(jié)點(diǎn)調(diào)用buildChildren方法,遞歸構(gòu)建子節(jié)點(diǎn)。
- 以便支持傳入的pId作為頂級(jí)節(jié)點(diǎn)
public class TreeBuilder { /** * @param nodes 需要構(gòu)建的nodes,不要繼承 TreeNode,且需要有 TreeNode 下的三個(gè)方法 * @param pId 父id。為null則是所有pid為null的是頂級(jí)節(jié)點(diǎn);不為null,則是從給的pId往下查詢并構(gòu)建樹 **/ public static <T extends TreeNode> List<T> buildTree(List<T> nodes, String pId) { List<T> roots = new ArrayList<>(); for (T node : nodes) { if (node.getId().equals(pId) || (node.getParentId() == null && (pId == null || pId.equals(node.getId())))) { roots.add(node); } } for (T root : roots) { buildChildren(root, nodes); } return roots; } private static <T extends TreeNode> void buildChildren(T node, List<T> nodes) { for (T child : nodes) { if (child.getParentId() != null && child.getParentId().equals(node.getId())) { node.getChildren().add(child); buildChildren(child, nodes); } } } }
構(gòu)建到幾級(jí)
- 如果再增加一個(gè)參數(shù),構(gòu)建到樹的第幾層該如何實(shí)現(xiàn)?
- 根據(jù)需求,如果增加一個(gè)參數(shù)來控制構(gòu)建到樹的第幾層,可以在buildChildren方法中添加一個(gè)level參數(shù),用于記錄當(dāng)前節(jié)點(diǎn)的層數(shù)。在遞歸構(gòu)建子節(jié)點(diǎn)時(shí),如果當(dāng)前節(jié)點(diǎn)的層數(shù)小于指定的層數(shù),則繼續(xù)遞歸構(gòu)建子節(jié)點(diǎn),否則停止遞歸。以下是修改后的Java示例代碼:
public class TreeBuilder { /** * @param level 級(jí)別 從1開始。1是最頂層 **/ public static <T extends TreeNode> List<T> buildTree(List<T> nodes, String pId, int level) { List<T> roots = new ArrayList<>(); for (T node : nodes) { if (node.getId().equals(pId) || (node.getParentId() == null && (pId == null || pId.equals(node.getId())))) { roots.add(node); } } for (T root : roots) { buildChildren(root, nodes, level, 1); } return roots; } private static <T extends TreeNode> void buildChildren(T node, List<T> nodes, int level, int currentLevel) { if (currentLevel >= level) { return; } for (T child : nodes) { if (child.getParentId() != null && child.getParentId().equals(node.getId())) { if (node.getChildren() == null) { node.setChildren(new ArrayList<>()); } node.getChildren().add(child); buildChildren(child, nodes, level, currentLevel + 1); } } } }
三、使用
1、實(shí)現(xiàn)TreeNode接口
public class MyTreeVo implements TreeNode { /** * 主鍵 */ private String id; /** * 父節(jié)點(diǎn)ID */ private String pId; /** * 子級(jí) */ private List<MyTreeVo> children = Lists.newArrayList(); //其他屬性…… public List<MyTreeVo> getChildren() { return children; } public String getId() { return id; } public String getpId() { return pId; } //其他屬性的getter、setter……
2、使用
- pId可以傳入null,也可以傳入需要從哪個(gè)節(jié)點(diǎn)(X)開始構(gòu)造的 X的id
List<MyTreeVo> tree = TreeUtilQz.buildTree(vos,null); //tree就是構(gòu)建好的樹結(jié)構(gòu)數(shù)據(jù)
3、樣例
{ "data": [ { "id": "e6ee51485389495cb923a122be800011", "pId": "", "name": "一、鋼管鋼管", "children": [ { "id": "e6ee51485389495cb923a122be800014", "pId": "e6ee51485389495cb923a122be800011", "name": "(二)嘎嘎嘎嘎嘎", "children": [] }, { "id": "e6ee51485389495cb923a122be800013", "pId": "e6ee51485389495cb923a122be800011", "name": "(一)頂頂頂頂", "children": [] } ] }, { "id": "e6ee51485389495cb923a122be800012", "pId": "", "name": "二、噢噢噢噢", "children": [ { "id": "e6ee51485389495cb923a122be800015", "pId": "e6ee51485389495cb923a122be800012", "name": "二的下級(jí)", "children": [ { "id": "e6ee51485389495cb923a122be800016", "pId": "e6ee51485389495cb923a122be800015", "name": "二的下級(jí)的下級(jí)", "children": [] } ] } ] } ] }
到此這篇關(guān)于詳解Java構(gòu)建樹結(jié)構(gòu)的公共方法的文章就介紹到這了,更多相關(guān)Java構(gòu)建樹結(jié)構(gòu)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java實(shí)現(xiàn)遞歸查詢樹結(jié)構(gòu)的示例代碼
- java樹結(jié)構(gòu)stream工具類的示例代碼詳解
- java合成模式之神奇的樹結(jié)構(gòu)
- JAVA使用hutool工具實(shí)現(xiàn)查詢樹結(jié)構(gòu)數(shù)據(jù)(省市區(qū))
- JAVA如何轉(zhuǎn)換樹結(jié)構(gòu)數(shù)據(jù)代碼實(shí)例
- JAVA后臺(tái)轉(zhuǎn)換成樹結(jié)構(gòu)數(shù)據(jù)返回給前端的實(shí)現(xiàn)方法
- Java實(shí)現(xiàn)簡(jiǎn)單樹結(jié)構(gòu)
- java后端操作樹結(jié)構(gòu)的案例代碼
相關(guān)文章
java long轉(zhuǎn)String +Codeforces110A案例
這篇文章主要介紹了java long轉(zhuǎn)String +Codeforces110A案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-09-09Java 必知必會(huì)的 URL 和 URLConnection使用
這篇文章主要介紹了Java 必知必會(huì)的 URL 和 URLConnection使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10JAVA Iterator 轉(zhuǎn)成 List 的操作
這篇文章主要介紹了JAVA Iterator 轉(zhuǎn)成 List 的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-12-12使用Jacoco獲取 Java 程序的代碼執(zhí)行覆蓋率的步驟詳解
這篇文章主要介紹了使用Jacoco獲取 Java 程序的代碼執(zhí)行覆蓋率的步驟詳解,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下2021-03-03SpringBoot JavaMailSender發(fā)送郵件功能
這篇文章主要為大家詳細(xì)介紹了SpringBoot JavaMailSender發(fā)送郵件功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-04-04