java如何用遞歸生成樹(shù)形結(jié)構(gòu)
java用遞歸生成樹(shù)形結(jié)構(gòu)
1、準(zhǔn)備實(shí)體對(duì)象
public class TreeNode{ private int id; private int pid; private String name; private String content; private List<TreeNode> children; public TreeNode() { } public TreeNode(int id, int pid, String name, String content) { this.id = id; this.pid = pid; this.name = name; this.content = content; } public int getId() { return id; } public void setId(int id) { this.id = id; } public int getPid() { return pid; } public void setPid(int pid) { this.pid = pid; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } public List<TreeNode> getChildren(){ return children; } public void setChildren(List<TreeNode> children){ this.children = children; } @Override public String toString() { return "TreeNode{" + "id=" + id + ", pid=" + pid + ", name='" + name + '\'' + ", content='" + content + '\'' + '}'; } }
2、準(zhǔn)備測(cè)試數(shù)據(jù)
//生成測(cè)試數(shù)據(jù)方法 public static List<TreeNode> generateList(){ List<TreeNode> list = new ArrayList<>(); TreeNode treeModel1 = new TreeNode(1,0,"系統(tǒng)管理",getRandomStr()); TreeNode treeModel2 = new TreeNode(11,1,"用戶管理",getRandomStr()); TreeNode treeModel3 = new TreeNode(111,11,"用戶添加",getRandomStr()); TreeNode treeModel4 = new TreeNode(2,0,"權(quán)限管理",getRandomStr()); TreeNode treeModel5 = new TreeNode(21,2,"賬號(hào)管理",getRandomStr()); TreeNode treeModel6 = new TreeNode(221,2,"角色管理",getRandomStr()); list.add(treeModel1); list.add(treeModel2); list.add(treeModel3); list.add(treeModel4); list.add(treeModel5); list.add(treeModel6); return list; } //隨便寫了一個(gè)由26個(gè)小寫字母隨機(jī)生成字符串方法 public static String getRandomStr(){ StringBuilder ret= new StringBuilder(); for (int i = 0; i < 6; i++) { int num=(int)(Math.random()*26+97); ret.append((char) num); } return ret.toString(); }
3、構(gòu)造樹(shù)形結(jié)構(gòu)遞歸函數(shù)
/** * 生成樹(shù) * @param list 待處理的數(shù)據(jù)集合 * @param pid 最頂層的父級(jí)id */ public static List<TreeNode> createTree(List<TreeNode> list,int pid){ //根據(jù)父id過(guò)濾出所有父節(jié)點(diǎn) List<TreeNode> tree = list.stream().filter(e-> pid == e.getPid()).collect(Collectors.toList()); //遍歷所有父節(jié)點(diǎn),把屬于該節(jié)點(diǎn)的所有子節(jié)點(diǎn)加到該節(jié)點(diǎn)的children屬性下 for (TreeNode node: tree) { int id = node.getId(); //過(guò)濾出所有屬于該節(jié)點(diǎn)的子節(jié)點(diǎn) List<TreeNode> cList = list.stream().filter(e-> id == e.getPid()).collect(Collectors.toList()); //判斷是否存在子節(jié)點(diǎn),若子節(jié)點(diǎn)有數(shù)據(jù)則把該子節(jié)點(diǎn)的id作為pid繼續(xù)遞歸往下層處理 if(!SysUtil.isNull(cList)){ createTree(list,id); node.setChildren(cList); } } return tree; }
4、測(cè)試
public static void main(String[] args) throws Exception { List<TreeNode> list = generateList(); list.forEach(System.out::println); List<TreeNode> tree = createTree(list,0); System.out.println(JSON.toJSONString(tree)); }
5、輸出結(jié)果
TreeNode{id=1, pid=0, name='系統(tǒng)管理', content='vyzjpq'}
TreeNode{id=11, pid=1, name='用戶管理', content='qwbiex'}
TreeNode{id=111, pid=11, name='用戶添加', content='zuyuth'}
TreeNode{id=2, pid=0, name='權(quán)限管理', content='ctgevw'}
TreeNode{id=21, pid=2, name='賬號(hào)管理', content='ulgvdx'}
TreeNode{id=221, pid=2, name='角色管理', content='fzxufe'}
[{"children":[{"children":[{"content":"zuyuth","id":111,"name":"用戶添加","pid":11}],"content":"qwbiex","id":11,"name":"用戶管理","pid":1}],"content":"vyzjpq","id":1,"name":"系統(tǒng)管理","pid":0},{"children":[{"content":"ulgvdx","id":21,"name":"賬號(hào)管理","pid":2},{"content":"fzxufe","id":221,"name":"角色管理","pid":2}],"content":"ctgevw","id":2,"name":"權(quán)限管理","pid":0}]
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java實(shí)現(xiàn)發(fā)送短信驗(yàn)證碼+redis限制發(fā)送的次數(shù)功能
這篇文章主要介紹了Java實(shí)現(xiàn)發(fā)送短信驗(yàn)證碼+redis限制發(fā)送的次數(shù),本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04Java開(kāi)發(fā)中的OOM內(nèi)存溢出問(wèn)題詳解
這篇文章主要介紹了Java開(kāi)發(fā)中的OOM內(nèi)存溢出問(wèn)題詳解,OOM,全稱?Out?Of?Memory,意思是內(nèi)存耗盡或內(nèi)存溢出,當(dāng)JVM因?yàn)闆](méi)有足夠的內(nèi)存來(lái)為對(duì)象分配空間并且垃圾回收器也已經(jīng)沒(méi)有空間可回收時(shí),就會(huì)拋出這個(gè)?error,需要的朋友可以參考下2023-08-08SpringBoot?緩存預(yù)熱的實(shí)現(xiàn)
本文主要介紹了SpringBoot?緩存預(yù)熱的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2007-11-11Spring?Boot異步線程間數(shù)據(jù)傳遞的四種方式
這篇文章主要為大家介紹了Spring?Boot異步線程間數(shù)據(jù)傳遞的四種方式詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01java 中mongodb的各種操作查詢的實(shí)例詳解
這篇文章主要介紹了java 中mongodb的各種操作查詢的實(shí)例詳解的相關(guān)資料,希望通過(guò)本文能幫助到大家,需要的朋友可以參考下2017-09-09HashMap vs TreeMap vs Hashtable vs LinkedHashMap
這篇文章主要介紹了HashMap vs TreeMap vs Hashtable vs LinkedHashMap的相關(guān)知識(shí),非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-07-07java數(shù)組與以逗號(hào)分隔開(kāi)的字符串的相互轉(zhuǎn)換操作
這篇文章主要介紹了java數(shù)組與以逗號(hào)分隔開(kāi)的字符串的相互轉(zhuǎn)換操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09