以下是service层的实现代码
@Override
public List<TreeVO> treeList() {
//先将数据库的数据全部查出来
List<AreaEntity> list = this.list();
//定义集合接收所有查出来的数据
List<TreeVO> allTreeVOs = new ArrayList<>();
//定义集合接收所有顶级的数据(也就是upId==0的数据)
List<TreeVO> rootNodeList = new ArrayList<>();
Map<String, Integer> idMaps = new HashMap<>();
Iterator<AreaEntity> recordIterable = list.iterator();
int i = 0;
while(recordIterable.hasNext()){
AreaEntity record = recordIterable.next();
TreeVO treeVO = new TreeVO();
String key = record.getId().toString();
Long upId = record.getUpId();
treeVO.setUpId(upId.toString());
treeVO.setValue(key);
treeVO.setTitle(record.getMergeName());
Map<String, Object> props = BeanUtil.beanToMap(record);
treeVO.setProps(props);
//把每一条TreeVO数据放到allTreeVOs集合中
allTreeVOs.add(treeVO);
if(upId == 0L){
//把顶层数据放到rootNodeList集合中
rootNodeList.add(treeVO);
}
//将每一条TreeVO数据的主键id和在allTreeVOs集合中的下标存入map集合中
idMaps.put(key, i);
i++;
}
for (TreeVO treeVO : allTreeVOs) {
//遍历集合,看每一条treeVo是否存在上级
String upIdStr = treeVO.getProps().get(TREE_PARENT_ID_FIELD_NAME).toString();
if (!idMaps.containsKey(upIdStr)) {
continue;
}
//根据上面获取的上级id拿到父节点
TreeVO parentNode = allTreeVOs.get(idMaps.get(upIdStr));
if (parentNode != null) {
//父节点和子节点链接
parentNode.getChildren().add(treeVO);
parentNode.setIsLeaf(false);
}
}
return rootNodeList;
}