0总体思想
实体 A的数据库字段包含 a_uuid(本身uuid),a_parent_uuid(父节点uuid)
业务字段有 children(该节点的子节点),childrenFlag(有无子节点的标志)
根节点没有父节点,可以设置为根节点的parent=0(作为根节点的标志)
1递归list转树
1查询该数据的所有
List<A> all=;
2获取根节点
//将list转换成树结构的A对象 返回前端
A parent = XX.selectOne;
3递归获取 每个节点的子节点(每次都把每个节点当作根节点去递归查询其子节点,直至没有子节点为止)
A trees = recursiveTree(parent, all);
整体代码
/**
* 递归list:list转树结构
*
* @param parentNode 某个父节点
* @param AllList 所有节点信息
* @return 获取某个父节点下的所有子节点
*/
public SimuSubjectTask recursiveTree(A parentNode, List<A> AllList) {
//获取子节点
List<A> childTreeNodes = findChildrenTree(parentNode.getAUuid(), AllList);
//若子节点不为空,则将子节点添加至所属父节点信息中
if (!CollectionUtils.isEmpty(childTreeNodes)) {
List<A> childList = new ArrayList<>();
for (Achild : childTreeNodes) {
//继续向下找子节点
SimuSubjectTask item = recursiveTree(child, AllList);
//存储子节点
childList.add(item);
}
//获取非数据库字段展示(children,childrenFlag,)
parentNode.setChildren(childList);
parentNode.setChildrenFlag("1");
}
return parentNode;
}
//获取子节点list
public List<A> findChildrenTree(String aUuid, List<A> AllList) {
List<A> childNodes = new ArrayList<>();
for (A item : AllList) {
if (Objects.equals(item.getAParentUuid(), aUuid)) {
childNodes.add(item);
}
}
return childNodes;
}
2树转list
/**
* tree转换为list
*
* @param tree
* @return
*/
public List<A> treeToList(A tree, String pid) {
List<A> resultList = new ArrayList<>();
tree.setAParentUuid(pid);
if (tree.getChildren() != null && tree.getChildren().size() > 0) {
for (Ait : tree.getChildren()) {
resultList.addAll(treeToList(it, it.getAParentUuid()));
tree.setChildren(null);
resultList.add(tree);
}
} else {
resultList.add(tree);
}
return resultList;
}