java如何用遞歸生成樹形結(jié)構(gòu)
java用遞歸生成樹形結(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)造樹形結(jié)構(gòu)遞歸函數(shù)
/**
* 生成樹
* @param list 待處理的數(shù)據(jù)集合
* @param pid 最頂層的父級(jí)id
*/
public static List<TreeNode> createTree(List<TreeNode> list,int pid){
//根據(jù)父id過濾出所有父節(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();
//過濾出所有屬于該節(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)文章
詳解RabbitMQ中延遲隊(duì)列結(jié)合業(yè)務(wù)場景的使用
這篇文章主要介紹了詳解RabbitMQ中延遲隊(duì)列結(jié)合業(yè)務(wù)場景的使用,延遲隊(duì)列中的元素都是帶有時(shí)間屬性的,延遲隊(duì)列就是用來存放需要在指定時(shí)間被處理的元素的隊(duì)列,需要的朋友可以參考下2023-05-05
Spring Boot Starter中Bean 注冊(cè)與屬性綁定的兩大機(jī)制最佳實(shí)踐方案
在 Spring Boot的世界里,Starter(啟動(dòng)器)是簡化依賴管理和自動(dòng)化配置的強(qiáng)大工具,本文將深入探討 Spring Boot Starter 中 Bean 初始化的核心機(jī)制,并指出最佳實(shí)踐,感興趣的朋友跟隨小編一起看看吧2025-10-10
Java中的NoClassDefFoundError報(bào)錯(cuò)含義解析
這篇文章主要為大家介紹了Java中的NoClassDefFoundError含義詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助2023-11-11
SpringBoot使用Validation包進(jìn)行輸入?yún)?shù)校驗(yàn)
Spring Boot 自帶的 spring-boot-starter-validation 包支持以標(biāo)準(zhǔn)注解的方式進(jìn)行輸入?yún)?shù)校驗(yàn),本文即關(guān)注 spring-boot-starter-validation 包所涵蓋的標(biāo)準(zhǔn)注解的使用、校驗(yàn)異常的捕獲與展示、分組校驗(yàn)功能的使用,以及自定義校驗(yàn)器的使用,需要的朋友可以參考下2024-05-05

