树形菜单权限过滤

题目:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值