如何拼装树结构?
可以使用jdk1.8+递归可以实现
代码如下:
1、实体类
package com.daka.dto;
import lombok.*;
/**
* 数据
*/
@Data
@ToString
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class TreeStructureDTO {
/**
* 节点id
*/
private Long id;
/**
* 节点名称
*/
private String name;
/**
* 父节点
*/
private Long parentId;
/**
* 层级
*
*/
private Integer level;
/**
* 根目录
*/
private Long rootId;
}
2、树对象:
package com.daka.vo;
import lombok.*;
import java.util.List;
@Data
@Builder
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class Tree {
private Long id;
private String name;
private Long parentId;
private List<Tree> children;
}
3、实现
package com.daka.daka;
import com.alibaba.fastjson.JSON;
import com.daka.dto.TreeStructureDTO;
import com.daka.util.StructureUtils;
import com.daka.vo.Tree;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
* 处理树
*/
public class StructureOperation {
public static void main(String[] args){
// 获取参数
List<TreeStructureDTO> structureDTOS = packData();
System.out.println("树结构param:" + JSON.toJSONString(structureDTOS));
// 开始组装树
// 现先获取根节点
TreeStructureDTO rootTreeStructure = structureDTOS.stream()
.filter(structureDTO -> structureDTO.getParentId() == null)
.collect(Collectors.toList()).get(0);
Tree rootTree = Tree.builder()
.id(rootTreeStructure.getId())
.name(rootTreeStructure.getName())
.parentId(null)
.build();
Tree tree = StructureUtils.packageTree(structureDTOS, rootTree);
System.out.println("树结构result:" + JSON.toJSONString(tree));
}
/**
* 组装数据(模拟从数据库中获取)
*/
public static List<TreeStructureDTO> packData(){
List<TreeStructureDTO> result = new ArrayList<TreeStructureDTO>();
result.add(TreeStructureDTO.builder().id(1L).parentId(null).name("根节点").rootId(null).level(0).build());
result.add(TreeStructureDTO.builder().id(2L).parentId(1L).name("1级节点A").rootId(1L).level(1).build());
result.add(TreeStructureDTO.builder().id(3L).parentId(1L).name("1级节点B").rootId(1L).level(1).build());
result.add(TreeStructureDTO.builder().id(4L).parentId(2L).name("2级节点A").rootId(1L).level(2).build());
result.add(TreeStructureDTO.builder().id(5L).parentId(2L).name("2级节点B").rootId(1L).level(2).build());
result.add(TreeStructureDTO.builder().id(6L).parentId(3L).name("2级节点C").rootId(1L).level(2).build());
result.add(TreeStructureDTO.builder().id(7L).parentId(5L).name("3级节点A").rootId(1L).level(3).build());
result.add(TreeStructureDTO.builder().id(8L).parentId(6L).name("3级节点B").rootId(1L).level(3).build());
result.add(TreeStructureDTO.builder().id(9L).parentId(6L).name("3级节点C").rootId(1L).level(3).build());
return result;
}
}
4、递归实现:
package com.daka.util;
import com.daka.dto.TreeStructureDTO;
import com.daka.vo.Tree;
import java.util.ArrayList;
import java.util.List;
public class StructureUtils {
public static Tree packageTree(List<TreeStructureDTO> structureDTOS, Tree rootTree){
if (structureDTOS != null && structureDTOS.size() > 0) {
structureDTOS.forEach(structureDTO -> judgeObj(structureDTO, rootTree));
if (rootTree.getChildren() != null && rootTree.getChildren().size() > 0) {
rootTree.getChildren().forEach(r -> packageTree(structureDTOS, r));
}
}
return rootTree;
}
public static void judgeObj(TreeStructureDTO structureDTO, Tree rootTree){
List<Tree> children = rootTree.getChildren();
if (children == null) {
children = new ArrayList<>();
}
if (structureDTO.getParentId() != null && rootTree.getId().equals(structureDTO.getParentId())) {
children.add(Tree.builder().id(structureDTO.getId()).name(structureDTO.getName()).parentId(structureDTO.getParentId()).build());
rootTree.setChildren(children);
}
}
}
入参:
[{"id":1,"level":0,"name":"根节点"},
{"id":2,"level":1,"name":"1级节点A","parentId":1,"rootId":1},
{"id":3,"level":1,"name":"1级节点B","parentId":1,"rootId":1},
{"id":4,"level":2,"name":"2级节点A","parentId":2,"rootId":1},
{"id":5,"level":2,"name":"2级节点B","parentId":2,"rootId":1},
{"id":6,"level":2,"name":"2级节点C","parentId":3,"rootId":1},
{"id":7,"level":3,"name":"3级节点A","parentId":5,"rootId":1},
{"id":8,"level":3,"name":"3级节点B","parentId":6,"rootId":1},
{"id":9,"level":3,"name":"3级节点C","parentId":6,"rootId":1}]
结果:
{
"children": [{
"children": [{
"id": 4,
"name": "2级节点A",
"parentId": 2
}, {
"children": [{
"id": 7,
"name": "3级节点A",
"parentId": 5
}],
"id": 5,
"name": "2级节点B",
"parentId": 2
}],
"id": 2,
"name": "1级节点A",
"parentId": 1
}, {
"children": [{
"children": [{
"id": 8,
"name": "3级节点B",
"parentId": 6
}, {
"id": 9,
"name": "3级节点C",
"parentId": 6
}],
"id": 6,
"name": "2级节点C",
"parentId": 3
}],
"id": 3,
"name": "1级节点B",
"parentId": 1
}],
"id": 1,
"name": "根节点"
}