最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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)文章

  • mybatis where 標(biāo)簽使用

    mybatis where 標(biāo)簽使用

    where標(biāo)記的作用類似于動(dòng)態(tài)sql中的set標(biāo)記,本文主要介紹了mybatis where 標(biāo)簽使用,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Spring?Integration概述與怎么使用詳解

    Spring?Integration概述與怎么使用詳解

    公司項(xiàng)目需要用到spring integration,而網(wǎng)上關(guān)于spring integration的有價(jià)值的參考資料比較少,下面這篇文章主要給大家介紹了關(guān)于Spring?Integration概述與怎么使用的相關(guān)資料,需要的朋友可以參考下
    2023-02-02
  • Java設(shè)計(jì)模式之代理模式詳解

    Java設(shè)計(jì)模式之代理模式詳解

    這篇文章主要介紹了Java設(shè)計(jì)模式之代理模式詳解,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有很好的幫助,需要的朋友可以參考下
    2021-05-05
  • 詳解RabbitMQ中延遲隊(duì)列結(jié)合業(yè)務(wù)場景的使用

    詳解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中Bean 注冊(cè)與屬性綁定的兩大機(jī)制最佳實(shí)踐方案

    在 Spring Boot的世界里,Starter(啟動(dòng)器)是簡化依賴管理和自動(dòng)化配置的強(qiáng)大工具,本文將深入探討 Spring Boot Starter 中 Bean 初始化的核心機(jī)制,并指出最佳實(shí)踐,感興趣的朋友跟隨小編一起看看吧
    2025-10-10
  • Java中equals和==的區(qū)別小結(jié)

    Java中equals和==的區(qū)別小結(jié)

    ==?和?equals()?都用于比較兩個(gè)對(duì)象,本文主要介紹了Java中equals和==的區(qū)別小結(jié),文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-06-06
  • Java中的NoClassDefFoundError報(bào)錯(cuò)含義解析

    Java中的NoClassDefFoundError報(bào)錯(cuò)含義解析

    這篇文章主要為大家介紹了Java中的NoClassDefFoundError含義詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2023-11-11
  • JavaWeb中web.xml初始化加載順序詳解

    JavaWeb中web.xml初始化加載順序詳解

    本篇文章主要介紹了JavaWeb中web.xml初始化加載順序詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-05-05
  • SpringBoot使用Validation包進(jìn)行輸入?yún)?shù)校驗(yàn)

    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
  • Java中關(guān)于OAuth2.0的原理分析

    Java中關(guān)于OAuth2.0的原理分析

    這篇文章主要介紹了Java中關(guān)于OAuth2.0的原理分析,OAuth是一個(gè)關(guān)于授權(quán)的開放網(wǎng)絡(luò)標(biāo)準(zhǔn),允許用戶授權(quán)第三 方應(yīng)用訪問他們存儲(chǔ)在另外的服務(wù)提供者上的信息,而不需要將用戶名和密碼提供給第三方移動(dòng)應(yīng)用或分享他們數(shù)據(jù)的所有內(nèi)容,需要的朋友可以參考下
    2023-09-09

最新評(píng)論

辉南县| 融水| 永登县| 东城区| 霍林郭勒市| 泗阳县| 义乌市| 荆门市| 日照市| 盐源县| 博兴县| 丹阳市| 台北县| 临桂县| 丁青县| 三河市| 綦江县| 唐河县| 河西区| 新蔡县| 霞浦县| 班玛县| 筠连县| 佳木斯市| 乌什县| 舞钢市| 阿勒泰市| 本溪| 施秉县| 吉林市| 恩施市| 温泉县| 邵阳县| 青海省| 繁昌县| 宁津县| 工布江达县| 水富县| 宁晋县| 延吉市| 阿坝|