核心方法:
/**
* list转tree
* @param list 待转的list
* @param pid 顶级pid
* @return 树型结构数据
*/
private static List<DTO> getTree(List<DTO> list, String pid) {
List<DTO> rootList = new ArrayList<>();
Iterator<DTO> iterator = list.iterator();
while (iterator.hasNext()){
DTO dto = iterator.next();
if (pid.equals(dto.getPid())){
rootList.add(dto);
iterator.remove();
}
}
for (DTO dto : rootList) {
List<DTO> child = getTree(list, dto.getId());
dto.setChildren(child);
}
return rootList;
}
用法:
待转换的数据:
[
{
"id": "1",
"pid": "0"
},
{
"id": "2",
"pid": "0"
},
{
"id": "3",
"pid": "1"
},
{
"id": "4",
"pid": "1"
},
{
"id": "5",
"pid": "2"
},
{
"id": "6",
"pid": "2"
},
{
"id": "7",
"pid": "3"
}
]
转换之后的数据:
[
{
"children": [
{
"children": [
{
"children": [],
"id": "7",
"pid": "3"
}
],
"id": "3",
"pid": "1"
},
{
"children": [],
"id": "4",
"pid": "1"
}
],
"id": "1",
"pid": "0"
},
{
"children": [
{
"children": [],
"id": "5",
"pid": "2"
},
{
"children": [],
"id": "6",
"pid": "2"
}
],
"id": "2",
"pid": "0"
}
]
对应的实体类:
@Data
@Builder
public class DTO {
private String id;
@ParentId
private String pid;
private List<DTO> children = new ArrayList<>();
}
完整示例,main方法:
public class Main {
public static void main(String[] args) {
List<DTO> list = getList();
System.err.println("list:"+JSON.toJSONString(list));
List<DTO> tree = getTree(list, "0");
System.err.println("tree:"+JSON.toJSONString(tree));
}
public static List<DTO> getList() {
DTO dto1 = DTO.builder().id("1").pid("0").build();
DTO dto2 = DTO.builder().id("2").pid("0").build();
DTO dto3 = DTO.builder().id("3").pid("1").build();
DTO dto4 = DTO.builder().id("4").pid("1").build();
DTO dto5 = DTO.builder().id("5").pid("2").build();
DTO dto6 = DTO.builder().id("6").pid("2").build();
DTO dto7 = DTO.builder().id("7").pid("3").build();
List<DTO> list = new ArrayList<>();
list.add(dto1);
list.add(dto2);
list.add(dto3);
list.add(dto4);
list.add(dto5);
list.add(dto6);
list.add(dto7);
return list;
}
/**
* list转tree
* @param list 待转的list
* @param pid 顶级pid
* @return 树型结构数据
*/
private static List<DTO> getTree(List<DTO> list, String pid) {
List<DTO> rootList = new ArrayList<>();
Iterator<DTO> iterator = list.iterator();
while (iterator.hasNext()){
DTO dto = iterator.next();
if (pid.equals(dto.getPid())){
rootList.add(dto);
iterator.remove();
}
}
for (DTO dto : rootList) {
List<DTO> child = getTree(list, dto.getId());
dto.setChildren(child);
}
return rootList;
}
}