Java组装树结构

应用场景,数据库表里的多条数据互为父子级关系,现要对他们进行组装,形成树形结构的数据,需要到达如下效果:

[
	{
		"parentId": "0",
		"name": "一级目录1",
		"id": "10",
		"children": [
			{
				"parentId": "10",
				"name": "二级目录1",
				"id": "20",
				"children": []
			}
		]
	},
	{
		"parentId": "0",
		"name": "一级目录2",
		"id": "11",
		"children": [
			{
				"parentId": "11",
				"name": "二级目录2",
				"id": "21",
				"children": [
					{
						"parentId": "21",
						"name": "三级目录1",
						"id": "30",
						"children": []
					}
				]
			}
		]
	}
]

一、定义数据实体

public class Chapters {
    /** 目录id */
    private String id;
    /** 父目录id */
    private String parentId;
    /** 目录名称 */
    private String name;
    /** 子目录列表 */
    @Builder.Default
    private List<Chapters> children = new ArrayList<>();;
}

二、组装树结构的编码

public class Demo {

    public static void main(String[] args) {
        // 测试数据
        List<Chapters> list = getData();
        // 处理完成后的最终数据
        List<Chapters> resultList = new ArrayList<>();
        // 层级处理
        for (Chapters book : list) {
            // 父id是0,就是最大一级
            if ("0".equals(book.getParentId())) {
                resultList.add(book);
            }
            // 父子级判断,确定父子级关系后把子目录放到父目录下面
            for (Chapters book2 : list) {
                if (book.getId().equals(book2.getParentId())) {
                    book.getChildren().add(book2);
                }
            }
        }
        System.out.println(JSON.toJSONString(resultList));
    }

    // 测试数据,模拟从数据库中查询
    public static List<Chapters> getData() {
        // 为了方便就直接使用lombok的Builder,不new对象了
        Chapters book10 = Chapters.builder().id("10").parentId("0").name("一级目录1").build();
        Chapters book11 = Chapters.builder().id("11").parentId("0").name("一级目录2").build();

        Chapters book20 = Chapters.builder().id("20").parentId("10").name("二级目录1").build();
        Chapters book21 = Chapters.builder().id("21").parentId("11").name("二级目录2").build();

        Chapters book30 = Chapters.builder().id("30").parentId("21").name("三级目录1").build();

        List<Chapters> list = new ArrayList<>();
        list.add(book10);
        list.add(book11);
        list.add(book20);
        list.add(book21);
        list.add(book30);

        return list;
    }

}

执行结果:

 

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值