菜单权限过滤"/>
树形菜单权限过滤
题目:
输入:权限集合: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;}@Overridepublic 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
更多推荐
树形菜单权限过滤
发布评论