java后端递归计算多级分类目录

在网站的大多数目录中,经常出现多级目录的情况,即:

目录1------
    目录1.1
    目录1.2
目录2------
    目录2.1
    目录2.2

目录的最常见字段为:主键id,名称name,父目录parentId

此时如果需求是复制目录的时候,需要对查询出来的所有目录列表数据做处理,形成固定格式,使用递归来处理:

list.forEach(ele -> {
            String oldId = ele.getId();
            ele.setId(snowflake.nextIdStr());
            实体类类名 parent = ele;
            list.forEach(childELe -> {
                if (Objects.equals(oldId, childELe.getParentId())) {
                    childELe.setParentId(parent.getId());
                }
            });
        });

处理后得到的就是可以直接存入数据库的分类目录list集合

/** * 根据等级查询类目树 * * @param level * @return */ @Override public List queryCategoryTree(Integer level) { //查询当前级别下类目 List list = categoryDAO.list(level); //组装好的类目树,返回前端 List categoryTree = new ArrayList(); //所有类目 List allDTOList = new ArrayList(); if (CollectionUtils.isEmpty(list)) { return categoryTree; } for (CategoryDO categoryDO : list) { allDTOList.add(new CategoryTreeDTO().convertDOToDTO(categoryDO)); } //当前等级类目 categoryTree = allDTOList.stream().filter(dto -> level.equals(dto.getLevel())).collect(Collectors.toList()); for (CategoryTreeDTO categoryTreeDTO : categoryTree) { //组装类目为树结构 assembleTree(categoryTreeDTO, allDTOList,Constants.CATEGORY_MAX_LEVEL - level); } return categoryTree; } /** * 组装树 * * @param categoryTreeDTO * @param allList * @param remainRecursionCount 剩余递归次数 * @return */ public CategoryTreeDTO assembleTree(CategoryTreeDTO categoryTreeDTO, List allList, int remainRecursionCount) { remainRecursionCount--; //最大递归次数不超过Constants.CATEGORY_MAX_LEVEL-level次,防止坏数据死循环 if(remainRecursionCount < 0){ return categoryTreeDTO; } String categoryCode = categoryTreeDTO.getCategoryCode(); Integer level = categoryTreeDTO.getLevel(); //到达最后等级树返回 if (Constants.CATEGORY_MAX_LEVEL == level) { return categoryTreeDTO; } //子类目 List child = allList.stream().filter(a -> categoryCode.equals(a.getParentCode())).collect(Collectors.toList()); if (null == child) { return categoryTreeDTO; } categoryTreeDTO.setChildren(child); //组装子类目 for (CategoryTreeDTO dto : child) { assembleTree(dto, allList,remainRecursionCount); } return categoryTreeDTO; }
要查询多级分类菜单,可以使用递归来完成。具体实现步骤如下: 1. 定义一个菜单项类,包含菜单的id、名称、父级id等属性。 2. 编写一个SQL语句,从数据库中获取所有的菜单项,并将它们存储在一个列表中。 3. 在Java代码中,使用JDBC连接数据库,执行SQL语句并将结果集映射为菜单项列表。 4. 编写一个递归函数,传入当前菜单项的id和菜单项列表。函数的作用是返回当前菜单项下的子菜单项列表。 5. 在递归函数中,对于当前菜单项,遍历菜单项列表,找到它的子菜单项,并将它们添加到一个新的列表中。 6. 对于每个子菜单项,递归调用函数,获取它的子菜单项列表,并将它们添加到同一个列表中。 7. 返回子菜单项列表。 以下是一个简单的Java代码示例,实现查询多级分类菜单: ```java public class MenuItem { private int id; private String name; private int parentId; // getters and setters } public class MenuDao { private static final String SELECT_ALL_SQL = "SELECT * FROM menu"; public List<MenuItem> getAllMenuItems() { List<MenuItem> items = new ArrayList<>(); try (Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", "password")) { try (Statement stmt = conn.createStatement()) { try (ResultSet rs = stmt.executeQuery(SELECT_ALL_SQL)) { while (rs.next()) { MenuItem item = new MenuItem(); item.setId(rs.getInt("id")); item.setName(rs.getString("name")); item.setParentId(rs.getInt("parent_id")); items.add(item); } } } } catch (SQLException e) { e.printStackTrace(); } return items; } public List<MenuItem> getMenuItemsByParentId(int parentId) { List<MenuItem> subMenu = new ArrayList<>(); List<MenuItem> items = getAllMenuItems(); for (MenuItem item : items) { if (item.getParentId() == parentId) { subMenu.add(item); subMenu.addAll(getMenuItemsByParentId(item.getId())); } } return subMenu; } } // 使用示例 MenuDao dao = new MenuDao(); List<MenuItem> items = dao.getMenuItemsByParentId(0); // 获取根菜单下的子菜单列表 ``` 这里的 `getMenuItemsByParentId` 方法是一个递归方法,用于获取指定菜单项下的所有子菜单项。在方法中,首先获取所有的菜单项列表,然后遍历这个列表,找到指定菜单项的子菜单项,并将它们添加到一个新的列表中。对于每个子菜单项,递归调用 `getMenuItemsByParentId` 方法,获取它的子菜单项列表,并将它们添加到同一个列表中。最终返回子菜单项列表。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值