/*
* 构架树结构树形json--好用
* */
public class TreeUtil {
/**
* 根据pid,构建树节点
*/
public static <T extends CategoryTreeNode> List<T> build(List<T> treeNodes, Integer pid) {
List<T> treeList = new ArrayList<>();
for(T treeNode : treeNodes) {
if (pid.equals(treeNode.getParentId())) {
treeList.add(findChildren(treeNodes, treeNode));
}
}
return treeList;
}
/**
* 查找子节点
*/
private static <T extends CategoryTreeNode> T findChildren(List<T> treeNodes, T rootNode) {
for(T treeNode : treeNodes) {
if(rootNode.getId().equals(treeNode.getParentId())) {
rootNode.getChildren().add(findChildren(treeNodes, treeNode));
}
}
return rootNode;
}
/**
* 构建树节点
*/
public static <T extends CategoryTreeNode> List<T> build(List<T> treeNodes) {
List<T> result = new ArrayList<>();
//list转map
Map<Integer, T> nodeMap = new LinkedHashMap<>(treeNodes.size());
for(T treeNode : treeNodes){
nodeMap.put(treeNode.getId(), treeNode);
}
for(T node : nodeMap.values()) {
T parent = nodeMap.get(node.getParentId());
if(parent != null && !(node.getId().equals(parent.getId()))){
parent.getChildren().add(node);
continue;
}
result.add(node);
}
return result;
}
}
CategoryTreeNode类
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
@Data
public class CategoryTreeNode {
private Integer id;
private String title;
private Integer parentId;
private List<CategoryTreeNode> children = new ArrayList<>();
}
service中使用
public List<CategoryTreeNode> getSymptomTreeJson() {
//从数据库获取数据的list(一次性获取的所有数据)
List<CategoryTreeNode> list= symptomMapper.selectSymptomTreeNodeJson();
List<CategoryTreeNode> resultList = new ArrayList<>();
resultList = TreeUtil.build(allList); //进行封装
return resultList; //返回树形结构json
}
mapper层省略,用的是mybatis-plus
List<CategoryTreeNode> select(Wrapper<CategoryTreeNode> queryWrapper) throws Exception;