编写按顺序排序的树结构
不多说了,上代码
/**
* 查询菜单树形结构
*
* @return 结果
*/
public List<MenuVo> selectTreeMenu(){
//查看是否有缓存
if(redisService.hasKey("menuTree")){
List<MenuVo> menuTree = redisService.getCacheObject("menuTree");
return menuTree;
}
//返回数据
List<MenuVo> list = new ArrayList<>();
//存储所有的菜单
Map<String, MenuVo> menuTree = new HashMap<>();
//数据查询全部数据
List<MenuPo> menuPoList = menuDomainService.selectMenuTreeList();
for (MenuPo item : menuPoList) {
MenuVo MenuVo = new MenuVo();
BeanUtils.copyProperties(item, MenuVo);
//将所有菜单添加到 map 中
menuTree.put(Long.toString(item.getMenuId()),MenuVo);
}
//将 menuPoList 置空,垃圾回收
menuPoList = null;
//遍历将本身放入父元素
menuTree.entrySet().forEach(item -> {
//获取到当前节点
MenuVo menu = item.getValue();
//根据当前节点查询去map获取父级节点
MenuVo parentMenu = menuTree.get(Long.toString(menu.getParentMenuId()));
//判断是否有父级节点
if (parentMenu != null){
//给父级节点添加当前子
if(parentMenu.getChildren() != null){
//为当前集合元素排序
if(parentMenu.getChildren().size() < menu.getMenuSort()){
for (int i = parentMenu.getChildren().size(); i < menu.getMenuSort()-1; i++) {
parentMenu.getChildren().add(i,new MenuVo());
}
parentMenu.getChildren().add(menu.getMenuSort()-1,menu);
}else {
parentMenu.getChildren().set(menu.getMenuSort()-1,menu);
}
}else {
List<MenuVo> children = new ArrayList<>();
//初始化集合
for (int i = 0; i < menu.getMenuSort()-1; i++) {
children.add(i,new MenuVo());
}
children.add(menu.getMenuSort()-1,menu);
parentMenu.setChildren(children);
}
}
});
//迭代取出父元素
Iterator<Map.Entry<String, MenuVo>> it = menuTree.entrySet().iterator();
while(it.hasNext()) {
Map.Entry<String,MenuVo> entry=it.next();
MenuVo value = entry.getValue();
if(Long.toString(value.getParentMenuId()).equals("0")){
list.add(value);
}
}
//数据存入缓存
redisService.setCacheObject("menuTree", list, Constants.CAPTCHA_EXPIRATION, TimeUnit.MINUTES);
return list;
}
实体就多放一个children的list就行,看一下结构