应用场景,数据库表里的多条数据互为父子级关系,现要对他们进行组装,形成树形结构的数据,需要到达如下效果:
[
{
"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;
}
}
执行结果: