之前看到一位大佬的菜单树写法,但是找不到了,所以按着当时的理解编了一个查找菜单树,如果你还是一层层的套循环,那肯定没有这种炫酷
private ArrayList<Xiaolang> getTree(Long id, List<Xiaolang> list) {
//因为根节点可能有多个,所以我们用一个list存储没有父节点的根节点
ArrayList<Xiaolang> returnList = new ArrayList<>();
//使用map将list的数据存储到map中,方便下面使用,同时这个map也是整个代码的精华所在
//map的key存储id,value存储对象
HashMap<Long, Xiaolang> personMap = new HashMap<>();
for (int i = 0; i < list.size(); i++) {
Xiaolang person = list.get(i);
personMap.put(person.getId(), person);
}
//现在开始一个个遍历我们的list列表,逐个加入到树中来
for (int i = 0; i < list.size(); i++) {
Xiaolang person = list.get(i);
if (person.getParentId() == null) {
//如果没有父id,那他就是顶级树节点,就将它存在我们返回的列表中
returnList.add(person);
} else {
//如果有父id,那他就是子节点
Long parentId = person.getParentId();
//树结构被打乱后处理(子树不进行连接)
if (personMap.get(parentId) == null) {
continue;
}
//我们去找本次循环元素的父元素,然后将子放在父下
if (personMap.get(parentId).getChildMap() == null) {
//此时我们是第一个连接在父节点下的子,新建对象并存储
TreeMap<Long, Xiaolang> map = new TreeMap<Long, Xiaolang>();
map.put(person.getId(), person);
personMap.get(parentId).setChildMap(map);
//将孩子放入到list里面
ArrayList<Xiaolang> list1 = new ArrayList<>();
list1.add(person);
personMap.get(parentId).setChildList(list1);
} else {
//此时我们不是第一个连接在父节点下的子,直接存储
personMap.get(parentId).getChildMap().put(person.getId(), person);
personMap.get(parentId).getChildList().add(person);
}
}
}
//当指定了菜单树的id时候,我们会将该节点部分的数据返回过去
if (id != null) {
ArrayList<Xiaolang> sectionTree = new ArrayList<>();
sectionTree.add(personMap.get(id));
return sectionTree;
}
return returnList;
}
我们前端说不能接收map,所以我在其中加了个list。
public class Xiaolang {
private String personId;
/**
* 树查询的子map
*/
private TreeMap<Long,Xiaolang> childMap;
/**
* 树查询的列表
*/
private ArrayList<Xiaolang> childList;