欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java如何用遞歸生成樹形結(jié)構(gòu)

 更新時間:2025年03月04日 08:54:12   作者:L丶小先生  
作者分享了自己在使用腳本之家資源進(jìn)行編程時的經(jīng)驗,包括準(zhǔn)備實體對象、測試數(shù)據(jù)、構(gòu)造樹形結(jié)構(gòu)遞歸函數(shù)、測試以及輸出結(jié)果等步驟,作者希望這些經(jīng)驗?zāi)軐Υ蠹矣兴鶐椭?并鼓勵大家支持腳本之家

java用遞歸生成樹形結(jié)構(gòu)

1、準(zhǔn)備實體對象

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)備測試數(shù)據(jù)

//生成測試數(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,"賬號管理",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;
}

//隨便寫了一個由26個小寫字母隨機(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 最頂層的父級id
 */
public static List<TreeNode> createTree(List<TreeNode> list,int pid){
	//根據(jù)父id過濾出所有父節(jié)點
	List<TreeNode> tree = list.stream().filter(e-> pid == e.getPid()).collect(Collectors.toList());
	//遍歷所有父節(jié)點,把屬于該節(jié)點的所有子節(jié)點加到該節(jié)點的children屬性下
	for (TreeNode node: tree) {
		int id = node.getId();
		//過濾出所有屬于該節(jié)點的子節(jié)點
		List<TreeNode> cList = list.stream().filter(e-> id == e.getPid()).collect(Collectors.toList());
		//判斷是否存在子節(jié)點,若子節(jié)點有數(shù)據(jù)則把該子節(jié)點的id作為pid繼續(xù)遞歸往下層處理
		if(!SysUtil.isNull(cList)){
			createTree(list,id);
			node.setChildren(cList);
		}
	}
	return tree;
}

4、測試

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='賬號管理', 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":"賬號管理","pid":2},{"content":"fzxufe","id":221,"name":"角色管理","pid":2}],"content":"ctgevw","id":2,"name":"權(quán)限管理","pid":0}]

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java實現(xiàn)發(fā)送短信驗證碼+redis限制發(fā)送的次數(shù)功能

    Java實現(xiàn)發(fā)送短信驗證碼+redis限制發(fā)送的次數(shù)功能

    這篇文章主要介紹了Java實現(xiàn)發(fā)送短信驗證碼+redis限制發(fā)送的次數(shù),本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04
  • Java開發(fā)中的OOM內(nèi)存溢出問題詳解

    Java開發(fā)中的OOM內(nèi)存溢出問題詳解

    這篇文章主要介紹了Java開發(fā)中的OOM內(nèi)存溢出問題詳解,OOM,全稱?Out?Of?Memory,意思是內(nèi)存耗盡或內(nèi)存溢出,當(dāng)JVM因為沒有足夠的內(nèi)存來為對象分配空間并且垃圾回收器也已經(jīng)沒有空間可回收時,就會拋出這個?error,需要的朋友可以參考下
    2023-08-08
  • 從java面試題了解你所模糊的數(shù)組

    從java面試題了解你所模糊的數(shù)組

    這篇文章主要介紹了從java面試題了解你所模糊的數(shù)組,數(shù)組用來存儲一系列的數(shù)據(jù)項,其中的每一項具有相同的基本數(shù)據(jù)類型、類或相同的父類。通過使用數(shù)組,可以在很大程度上縮短和簡化程序代碼,從而提高應(yīng)用程序的效率。,需要的朋友可以參考下
    2019-06-06
  • SpringBoot?緩存預(yù)熱的實現(xiàn)

    SpringBoot?緩存預(yù)熱的實現(xiàn)

    本文主要介紹了SpringBoot?緩存預(yù)熱的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2007-11-11
  • 模仿Spring手寫一個簡易的IOC

    模仿Spring手寫一個簡易的IOC

    這篇文章主要介紹了模仿Spring手寫一個簡易的IOC,幫助大家更好的理解和學(xué)習(xí)spring框架,感興趣的朋友可以了解下
    2020-11-11
  • 深入理解java三種工廠模式

    深入理解java三種工廠模式

    下面小編就為大家?guī)硪黄钊肜斫鈐ava三種工廠模式。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-06-06
  • Spring?Boot異步線程間數(shù)據(jù)傳遞的四種方式

    Spring?Boot異步線程間數(shù)據(jù)傳遞的四種方式

    這篇文章主要為大家介紹了Spring?Boot異步線程間數(shù)據(jù)傳遞的四種方式詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • java 中mongodb的各種操作查詢的實例詳解

    java 中mongodb的各種操作查詢的實例詳解

    這篇文章主要介紹了java 中mongodb的各種操作查詢的實例詳解的相關(guān)資料,希望通過本文能幫助到大家,需要的朋友可以參考下
    2017-09-09
  • HashMap vs TreeMap vs Hashtable vs LinkedHashMap

    HashMap vs TreeMap vs Hashtable vs LinkedHashMap

    這篇文章主要介紹了HashMap vs TreeMap vs Hashtable vs LinkedHashMap的相關(guān)知識,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-07-07
  • java數(shù)組與以逗號分隔開的字符串的相互轉(zhuǎn)換操作

    java數(shù)組與以逗號分隔開的字符串的相互轉(zhuǎn)換操作

    這篇文章主要介紹了java數(shù)組與以逗號分隔開的字符串的相互轉(zhuǎn)換操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09

最新評論