问题描述
场景如下:
现有一份平铺的部门数据,由对象中的parentId 绑定为父部门的id,需要得到一份层级数据
目标–>不使用递归组装
json数据示例
原数据:
[
{
"id": 1,
"parentId": 0,
"departmentName": "一级部门1",
"childDepartments": [
]
},
{
"id": 2,
"parentId": 1,
"departmentName": "二级部门1",
"childDepartments": [
]
},
{
"id": 3,
"parentId": 1,
"departmentName": "二级部门2",
"childDepartments": [
]
},
{
"id": 4,
"parentId": 2,
"departmentName": "三级部门1",
"childDepartments": [
]
}
]
结果数据
[
{
"id": 1,
"parentId": 0,
"departmentName": "一级部门1",
"childDepartments": [
{
"id": 2,
"parentId": 1,
"departmentName": "二级部门1",
"childDepartments": [
{
"id": 4,
"parentId": 2,
"departmentName": "三级部门1",
"childDepartments": [
]
}
]
},
{
"id": 3,
"parentId": 1,
"departmentName": "二级部门2",
"childDepartments": [
]
}
]
}
]
实体类
public class DepartmentVo {
private Long id;
private Long parentId;
private String departmentName;
private List<DepartmentVo> childDepartments;
public DepartmentVo() {
}
public DepartmentVo(Long id, Long parentId, String departmentName) {
this.id = id;
this.parentId = parentId;
this.departmentName = departmentName;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Long getParentId() {
return parentId;
}
public void setParentId(Long parentId) {
this.parentId = parentId;
}
public String getDepartmentName() {
return departmentName;
}
public void setDepartmentName(String departmentName) {
this.departmentName = departmentName;
}
public List<DepartmentVo> getChildDepartments() {
return childDepartments;
}
public void setChildDepartments(List<DepartmentVo> childDepartments) {
this.childDepartments = childDepartments;
}
}
转换方法
public static List<DepartmentVo> departmentTransferVO2(List<DepartmentVo> list) {
if (ObjectUtils.isEmpty(list)) {
return null;
}
Map<Long, DepartmentVo> map = list.stream().collect(Collectors.toMap(DepartmentVo::getId, v -> v, (a, b) -> a));
return getDepartmentChildVO2(list, map);
}
private static List<DepartmentVo> getDepartmentChildVO2(List<DepartmentVo> list, Map<Long, DepartmentVo> map) {
List<DepartmentVo> res = new ArrayList<>();
for (DepartmentVo departmentVo : list) {
DepartmentVo departmentVo1 = map.get(departmentVo.getParentId());
if (departmentVo1 != null) {
List<DepartmentVo> childes = departmentVo1.getChildDepartments();
if (childes != null) {
childes.add(departmentVo);
} else {
departmentVo1.setChildDepartments(Lists.newArrayList(departmentVo));
}
} else {
res.add(departmentVo);
}
}
return res;
}
测试代码
public static void main(String[] args) {
List<DepartmentVo> list = new ArrayList<>();
DepartmentVo departmentVo1 = new DepartmentVo(1L,0L,"一级部门1");
list.add(departmentVo1);
DepartmentVo departmentVo2 = new DepartmentVo(2L,1L,"二级部门1");
list.add(departmentVo2);
DepartmentVo departmentVo3 = new DepartmentVo(3L,1L,"二级部门2");
list.add(departmentVo3);
DepartmentVo departmentVo4 = new DepartmentVo(4L,2L,"三级部门1");
list.add(departmentVo4);
List<DepartmentVo> departmentVos = departmentTransferVO2(list);
System.out.println(JSON.toJSONString(departmentVos));
}