在业务中往往有一些数据是有层级结构的,比如数据表中原始数据如下形式
id | name | parentId |
---|---|---|
1 | 1 | null |
2 | 1-1 | 1 |
3 | 1-1-1 | 2 |
4 | 1-1 | 1 |
想要将平铺的数据变成有层次的树形结构,这里分享一个非递归列表转为树形结构的思路方法。
基本的数据结构
@Data
public class Result implements Serializable {
private List<Result> children;
//父id
private Integer parentId;
//当前Id
private Integer id;
private String name;
}
转换方法
//sourceList 平铺的原始数据集合
public List<Result> list2Tree(List<Result> sourceList) {
if (CollectionUtils.isEmpty(sourceList)) {
return Collections.emptyList();
}
List<Result> resultList = new ArrayList<>();
//将数据封装成树形结构
Map<Integer, Result> map = new HashMap<>();
for (Result data : sourceList) {
map.put(data.getId(), data);
}
for (Result data : sourceList) {
Result obj = map.get(data.getParentId());
if (obj != null) {
List<Result> children = obj.getChildren();
if (children == null || children.isEmpty()) {
children = new ArrayList<>();
}
children.add(data);
obj.setChildren(children);
} else {
resultList.add(data);
}
}
return resultList;
}
经过list2Tree
方法转换之后,原始数据就被转为有层级的树形结构了。
原始数据json形式
[{
"id": 1,
"name": "1",
"parentId": null
}, {
"id": 2,
"name": "1-1",
"parentId": 1
}, {
"id": 3,
"name": "1-1-1",
"parentId": 2
}, {
"id": 4,
"name": "1-1",
"parentId": 1
}]
转完之后 树形结构
[{
"id": 1,
"name": "1",
"children": [{
"id": 2,
"name": "1-1",
"parentId": 1,
"children": [{
"id": 3,
"name": "1-1-1",
"parentId": 2
}]
}, {
"id": 4,
"name": "1-1",
"parentId": 1
}]
}]