一、需求
项目中需要向前台返回一个树形结构的集合,便于前端利用Element的树形控件展示。后台根据前端传递的id创建对应的树形结构返回集。根据先序遍历完成代码如下:
二、实现
判断是否有codeid,根据codeid创建对应的树形结构,若没有则返回查找到的全部树形结构。
public List<AnimalVO> getTree(String codeid) {
List<AnimalVO> resultList = new ArrayList<>();
//如果参数为空则查询所有的数据
if (StringUtils.isBlank(codeid)){
//查询所有的元素
List<AnimalVO> list = AnimalMapper.getTreeByParents();
resultList = buildDirectoryTree(list);
}
//查询指定类别的子树
if (StringUtils.isNotBlank(codeid)){
List<AnimalVO> list = AnimalMapper.getTreeById(codeid);
resultList =getChildListById(list);
}
return resultList;
}
根据id查询对应id的所有子集。同时递归查询子集是否存在子集。
private List<AnimalVO> getChildListById(List<AnimalVO> list) {
for (AnimalVO item : list) {
List<AnimalVO> chilids = AnimalMapper.getChild(String.valueOf(item.getId()));
item.setChildren(chilids);
if (chilids.size() > 0){
getChildListById(chilids);
}
}
estimateIsLeaf(list);
return list;
}
若没有codeid值,查询全部数据。遍历查询到的全部数据,并找到顶级父节点,并通过该节点查询对应子集并创建对应树结构。
private List<AnimalVO> buildDirectoryTree(List<AnimalVO> list) {
List<AnimalVO> resultList = new ArrayList<>();
for (AnimalVO AnimalVO : list) {
//判断是不是父节点
if (AnimalVO.getParentid().equals("0")){
recursionFn(list, AnimalVO);
resultList.add(AnimalVO);
}
}
if (resultList.isEmpty()){
resultList = list;
return resultList;
}
estimateIsLeaf(resultList);
return resultList;
}
通过递归查询animalVo的子集
private void recursionFn(List<AnimalVO> paramList, AnimalVO animalVO) {
List<AnimalVO> childlist = getChildList(paramList,AnimalVO);
AnimalVO.setChildren(childlist);
for (AnimalVO child : childlist) {
if (hasChild(paramList,child)){
recursionFn(paramList,child);
}
}
}
判断子集集合大小是否大于0,若大于0则递归recursionFn方法,查询对应子集。
private boolean hasChild(List<AnimalVO> paramList, AnimalVO evidenceCategoryVO) {
return getChildList(paramList,evidenceCategoryVO).size() > 0;
}
遍历paramList集合查询animalVo的子集。
private List<AnimalVO> getChildList(List<AnimalVO> paramList, AnimalVO animalVO) {
List<AnimalVO> list = new ArrayList<>();
Iterator<AnimalVO> iterators = paramList.iterator();
while (iterators.hasNext()){
AnimalVO child = iterators.next();
//判断子节点有没有父节点 是不是亲父节点
if (!StringUtils.isBlank(child.getParentid()) && child.getParentid().equals(String.valueOf(AnimalVO.getId()))){
list.add(child);
}
}
return list;
}
animalVo属性
public class AnimalVO {
private Integer id; //自增主键
private String codeId; //编码
private String animalName; //动物名称
private String animalOutLine; //动物纲目
private String parentId; //父级id
private Integer sorted; //排序
/**
* 叶节点标志 0否 1是
*/
private Integer isLeaf;
private List<AnimalVO> children = new ArrayList<>();
}
注意:当数据量过大时,该方法效率较低。若有其他更优解,请网友不吝分享。