题目:
输入:权限集合:11、122、21
菜单树列表:
1 系统管理
- 11 用户管理
- 12 权限与角色
- 121 权限管理
- 122 角色管理
- 13 组织管理
2 日志监控
- 21 日志查询
- 22 日志统计
3 资源管理
- 31 资源申请
- 32 资源审批
则输出为:
1 系统管理
- 11 用户管理
- 12 权限与角色
- 122 角色管理
2 日志监控
- 21 日志查询
public static List<Menu> initData() {
List<Menu> list = new ArrayList<>();
Menu menu1 = new Menu();
menu1.setKey("1");
menu1.setName("系统管理");
Menu menu11 = new Menu();
menu11.setKey("11");
menu11.setName("用户管理");
Menu menu12 = new Menu();
menu12.setKey("12");
menu12.setName("权限与角色");
Menu menu121 = new Menu();
menu121.setKey("121");
menu121.setName("权限管理");
Menu menu122 = new Menu();
menu122.setKey("122");
menu122.setName("角色管理");
Menu menu13 = new Menu();
menu13.setKey("13");
menu13.setName("组织管理");
menu12.getChild().add(menu121);
menu12.getChild().add(menu122);
menu1.getChild().add(menu11);
menu1.getChild().add(menu12);
menu1.getChild().add(menu13);
//------------------------
Menu menu2 = new Menu();
menu2.setKey("2");
menu2.setName("日志监控");
Menu menu21 = new Menu();
menu21.setKey("21");
menu21.setName("日志查询");
Menu menu22 = new Menu();
menu22.setKey("22");
menu22.setName("日志统计");
menu2.getChild().add(menu21);
menu2.getChild().add(menu22);
//-----------------------
Menu menu3 = new Menu();
menu3.setKey("3");
menu3.setName("资源管理");
Menu menu31 = new Menu();
menu31.setKey("31");
menu31.setName("资源申请");
Menu menu32 = new Menu();
menu32.setKey("32");
menu32.setName("资源审批");
menu3.getChild().add(menu31);
menu3.getChild().add(menu32);
list.add(menu1);
list.add(menu2);
list.add(menu3);
return list;
}
public class Menu {
String key;
String name;
List<Menu> child = new ArrayList<>();
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<Menu> getChild() {
return child;
}
public void setChild(List<Menu> child) {
this.child = child;
}
@Override
public String toString() {
return "Menu{" +
"key='" + key + '\'' +
", name='" + name + '\'' +
", child=" + child +
'}';
}
}
/**
* 解法一
*/
public static List<Menu> getAuthMenus(List<Menu> menuList, Set<String> menuKeysPermission) {
List<Menu> resultList = new ArrayList<>();
for (Menu menu : menuList) {
if (!menuKeysPermission.contains(menu.getKey())) {
List<Menu> childList = getAuthMenus(menu.getChild(), menuKeysPermission);
if (!childList.isEmpty()) {
Menu copyMenu = new Menu();
copyMenu.setName(menu.getName());
copyMenu.setKey(menu.getKey());
copyMenu.setChild(childList);
resultList.add(copyMenu);
}
} else {
resultList.add(menu);
}
}
return resultList;
}
/**
* 解法二
*/
public static void getAuthMenusTwo(List<Menu> menuList, Set<String> menuKeysPermission) {
Iterator<Menu> iterator = menuList.iterator();
while (iterator.hasNext()) {
Menu next = iterator.next();
getAuthMenusTwo(next.child, menuKeysPermission);
if (next.child.size() == 0 && !menuKeysPermission.contains(next.key)) {
iterator.remove();
continue;
}
}
}
public static void main(String[] args) {
List<Menu> menuList = initData();
Set<String> auths = new HashSet<>();
auths.add("11");
auths.add("122");
auths.add("21");
final List<Menu> authMenus = getAuthMenus(menuList, auths);
System.out.println("解法一getAuthMenus:" + authMenus);
getAuthMenusTwo(menuList, auths);
System.out.println("解法二getAuthMenus:" +menuList);
}
补充:解法一会比较消耗内存,解法二相比与解法一来讲不会递归创建集合对象,缺点是二者都是使用的是递归,欢迎大家发挥想象code refactoring