用Java封装菜单等树结构
创建菜单类, 需要补充一个用来装子菜单的属性,并保证一级菜单父id为-1 (可自定义)
public class MenuDto {
/**
* 表id
*/
private String id;
/**
* 菜单code
*/
private String code;
/**
* 菜单名称
*/
private String name;
/**
* 级别
*/
private Integer level;
/**
* 父菜单id
*/
private String pid;
/**
* 树路径
*/
private String path;
/**
* 创建人
*/
private String creator;
/**
* 创建时间
*/
private Date createTime;
/**
* 修改人
*/
private String modifier;
/**
* 修改时间
*/
private Date updateTime;
/**
* 角色菜单状态 1 勾选 2 未勾选
*/
private int status;
/**
* 在创建菜单类的时候 需要补充一个用来装子菜单的属性
*/
List<MenuDto> childMenus;
}
传入List<MenuDto> 进行递归操作 将菜单进行递归遍历封装成树结构
public static List<MenuDto> getMenuList(List<MenuDto> list) {
List<MenuDto> menuList = new ArrayList<>(); // 先找到所有的一级菜单
for (int i = 0; i < list.size(); i++) { // 一级菜单父ID为-1
if (list.get(i).getPid().equals("-1")) {
menuList.add(list.get(i));
}
} // 为一级菜单设置子菜单,getChild是递归调用的
for (MenuDto menu : menuList) {
menu.setChildMenus(getChild(menu.getId(), list));
}
Map<String,Object> jsonMap = new HashMap<String,Object>();
jsonMap.put("menu", menuList);
System.out.println(JSON.toJSONString(jsonMap));
return menuList;
}
//递归
private static List<MenuDto> getChild (String id, List < MenuDto > rootMenu){
// 子菜单
List<MenuDto> childList = new ArrayList<>();
for (MenuDto menu : rootMenu) {
// 遍历所有节点,将父菜单id与传过来的id比较
if (menu.getPid().equals(id)) {
childList.add(menu);
}
}
// 把子菜单的子菜单再循环一遍
for (MenuDto menu : childList) {
menu.setChildMenus(getChild(menu.getId(), rootMenu));
} // 判断递归结束
if (childList.size() == 0) {
return null;
}
return childList;
}
菜单树list去重方法
public static List repeatListWay(List<MenuDto> list){
List<MenuDto> newList = new ArrayList<>();
for(int i = 0; i < list.size(); i++ ){
boolean isContains = newList.contains(list.get(i));
if(!isContains){
newList.add(list.get(i));
}
}
list.clear();
list.addAll(newList);
return list;
}