使用Java递归实现树形菜单,并且手动分页

1-数据库结构

 2-查询所有菜单数据方法

public List<Permission> selectAll(){
    LambdaQueryWrapper<Permission> wrapper = new LambdaQueryWrapper<>();
    List<Permission> list = permissionMapper.selectList(wrapper);
    return list;
}

3-递归设置子节点方法

public List<Permission> setChild(List<Permission> list){
    if (CollUtil.isEmpty(list)){
        return null;
    }
    for (Permission permission : list) {
        List<Permission> temp = new ArrayList<>();
        for (Permission p : list) {
            if (p.getParentId().equals(permission.getId())){
                temp.add(p);
            }
        }
        setChild(temp);
        permission.setChild(temp);
    }
    return list;
}

4-手动分页

    public Page<Permission> page(Permission permission) {
        //分页工具,获取前端传来的分页参数
        Page page = ParamsUtils.getPage();
        long current = page.getCurrent();
        long size = page.getSize();
        //索引起点
        long start = ((current - 1) * size);
        //索引截至点
        long end = start + size;

        //查询所有
        List<Permission> list = selectAll();

        //设置子节点
        List<Permission> permissions = setChild(list);

        //只要父级点
        List<Permission> collect = permissions.stream().filter(p -> p.getParentId().equals(0l)).collect(Collectors.toList());
        //手动分页
        List<Permission> records = new ArrayList<>();
        if (end >= collect.size()){
            end = collect.size();
        }
        for (long i = start; i < end; i++) {
            records.add(collect.get((int) i));
        }

        page.setRecords(records);
        page.setTotal(collect.size());

        return page;
    }

5-分页工具类

public class ParamsUtils {

    public static Page getPage(){
        RequestAttributes attributes = RequestContextHolder.getRequestAttributes();
        ServletRequestAttributes servlet = (ServletRequestAttributes) attributes;
        HttpServletRequest request = servlet.getRequest();
        Long current = Convert.toLong(request.getParameter("current"));
        Long size = Convert.toLong(request.getParameter("size"));
        Page page = Page.of(current, size);
        return page;
    }

}

6-效果

总结一下缺点和优化点:

1-没在数据库层面分页,数据较多时服务器要处理的数据较多

2-没实现模糊查询功能

3-递归方法有待优化,第一轮递归应该只递归根节点,后面就不用过滤了,同时可以减小递归次数,减小服务器压力。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
假设我们有以下的树形菜单结构: ``` - 菜单1 - 子菜单1.1 - 子菜单1.2 - 孙菜单1.2.1 - 孙菜单1.2.2 - 菜单2 - 子菜单2.1 ``` 我们可以定义一个 Menu 类来表示每个菜单项: ```java class Menu { String name; List<Menu> children; public Menu(String name) { this.name = name; children = new ArrayList<>(); } // 添加子菜单 public void addChild(Menu menu) { children.add(menu); } } ``` 接下来,我们可以使用递归的方式来打印整个树形菜单: ```java class TreeMenu { public static void printMenu(Menu menu, int level) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < level; i++) { sb.append("-"); } sb.append(menu.name); System.out.println(sb.toString()); // 递归打印子菜单 for (Menu childMenu : menu.children) { printMenu(childMenu, level + 1); } } } public class Main { public static void main(String[] args) { // 构建树形菜单 Menu menu1 = new Menu("菜单1"); Menu menu11 = new Menu("子菜单1.1"); Menu menu12 = new Menu("子菜单1.2"); Menu menu121 = new Menu("孙菜单1.2.1"); Menu menu122 = new Menu("孙菜单1.2.2"); menu12.addChild(menu121); menu12.addChild(menu122); menu1.addChild(menu11); menu1.addChild(menu12); Menu menu2 = new Menu("菜单2"); Menu menu21 = new Menu("子菜单2.1"); menu2.addChild(menu21); // 打印树形菜单 TreeMenu.printMenu(menu1, 0); TreeMenu.printMenu(menu2, 0); } } ``` 输出结果为: ``` -菜单1 --子菜单1.1 --子菜单1.2 ---孙菜单1.2.1 ---孙菜单1.2.2 -菜单2 --子菜单2.1 ``` 我们通过递归遍历整棵树,按照菜单层级打印每个菜单项的名称,并加上相应的缩进。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值