前言
JAVA构建树形结构数据案例。
树形实体类
代码如下(示例):
get()
|| set()
方法就省略了,此处用lombok
的 @Data
注解代替
@Data
public class TreeBean {
/**
* id
*/
private String id;
/**
* 名称
*/
private String name;
/**
* 上级id
*/
private String parentId;
/**
* 子集 集合
*/
private List<TreeBean> children;
/**
* 无参构造
*/
public TreeBean() {
}
/**
* 自定义构造方法,省略子集变量
* @param id
* @param name
* @param parentId
*/
public TreeBean(String id, String name, String parentId) {
this.id = id;
this.name = name;
this.parentId = parentId;
}
}
lombok依赖坐标如下:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.18</version>
</dependency>
数据构造示例
模拟数据
代码如下(示例):
@GetMapping("childrenTest")
@ApiOperation(value = "树型结构数据测试接口",notes = "树型结构数据测试接口")
public ResponseEntity<List<TreeBean>> childrenTest(){
// 造假数据,真实环境下通过数据库查询。
// new TreeBean("id","名称","父级id")
List<TreeBean> list = new ArrayList<>();
list.add(new TreeBean("001","中国","0"));
list.add(new TreeBean("002","美国","0"));
list.add(new TreeBean("003","俄罗斯","0"));
list.add(new TreeBean("1","北京","001"));
list.add(new TreeBean("2","天津","001"));
list.add(new TreeBean("3","东城区","1"));
list.add(new TreeBean("4","西城区","1"));
list.add(new TreeBean("5","朝阳区","1"));
list.add(new TreeBean("6","和平区","2"));
list.add(new TreeBean("7","旧金山","002"));
list.add(new TreeBean("8","圣彼得堡","002"));
//调用构建树结构数据方法
List<TreeBean> children = getChildren(list, "0");
return ResponseEntity.ok(children);
}
递归构造数据
代码如下(示例):
/**
*构建树形结构数据
* @param beanList:数据集合
* @param parentId:父级标识(初始因该为最顶级的标识)
* @return
*/
public static List<TreeBean> getChildren(List<TreeBean> beanList,String parentId){
//创建返回树结构数据集合
List<TreeBean> treeList = new ArrayList<>();
for (TreeBean bean : beanList) {
//创建当前节点的bean
TreeBean treeBean = new TreeBean();
//创建当前节点下子节点的数据集合
List<TreeBean> childrenList = new ArrayList<>();
//如果当前节点等于【参数】父节点,则进行递归操作
if (parentId.equals(bean.getParentId())){
//将节点数据复制到当前bean下,也就是上面创建的【treeBean对象】
BeanUtils.copyProperties(bean,treeBean);
//递归查询当前节点是否有子节点
childrenList = getChildren(beanList,bean.getId());
//有则将子节点的数据集合添加到当前bean下
if (childrenList.size()>0){
treeBean.setChildren(childrenList);
}
//将当前构建的树对象放入返回集合中
treeList.add(treeBean);
}
}
return treeList;
}
测试案例
[
{
"id": "001",
"name": "中国",
"parentId": "0",
"children": [
{
"id": "1",
"name": "北京",
"parentId": "001",
"children": [
{
"id": "3",
"name": "东城区",
"parentId": "1",
"children": null
},
{
"id": "4",
"name": "西城区",
"parentId": "1",
"children": null
},
{
"id": "5",
"name": "朝阳区",
"parentId": "1",
"children": null
}
]
},
{
"id": "2",
"name": "天津",
"parentId": "001",
"children": [
{
"id": "6",
"name": "和平区",
"parentId": "2",
"children": null
}
]
}
]
},
{
"id": "002",
"name": "美国",
"parentId": "0",
"children": [
{
"id": "7",
"name": "旧金山",
"parentId": "002",
"children": null
},
{
"id": "8",
"name": "圣彼得堡",
"parentId": "002",
"children": null
}
]
},
{
"id": "003",
"name": "俄罗斯",
"parentId": "0",
"children": null
}
]