树形菜单权限过滤

编程入门 行业动态 更新时间:2024-10-23 21:29:51

树形<a href=https://www.elefans.com/category/jswz/34/1769013.html style=菜单权限过滤"/>

树形菜单权限过滤

题目:

输入:权限集合: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

更多推荐

树形菜单权限过滤

本文发布于:2024-02-11 17:12:54,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1682195.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:菜单   权限

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!