使用递归方式实现多级菜单树 Java实现

本文介绍了如何在Java中使用递归方法构建和遍历菜单树,通过`buildMenuTree`方法处理菜单列表,根据`parentId`关联子菜单,`printMenuTree`则进行树形展示。
摘要由CSDN通过智能技术生成

在Java中,使用递归来实现菜单树通常涉及到遍历原始菜单列表,并为每个菜单项找到其对应的子菜单项。这个过程可以通过创建一个方法来完成,该方法会检查每个菜单项的parentId,并将其作为子菜单项添加到具有相应id的父菜单项的children列表中。

以下是一个使用递归来实现菜单树的示例:

import java.util.*;  
  
public class Menu {  
    private int id;  
    private String name;  
    private int parentId;  
    private List<Menu> children;  
  
    public Menu(int id, String name, int parentId) {  
        this.id = id;  
        this.name = name;  
        this.parentId = parentId;  
        this.children = new ArrayList<>();  
    }  
  
    public int getId() {  
        return id;  
    }  
  
    public String getName() {  
        return name;  
    }  
  
    public int getParentId() {  
        return parentId;  
    }  
  
    public List<Menu> getChildren() {  
        return children;  
    }  
  
    public void setChildren(List<Menu> children) {  
        this.children = children;  
    }  
  
    // 构建菜单树的方法  
    public static List<Menu> buildMenuTree(List<Menu> menus) {  
        if (menus == null || menus.isEmpty()) {  
            return new ArrayList<>();  
        }  
  
        // 创建id到Menu对象的映射  
        Map<Integer, Menu> idToMenuMap = new HashMap<>();  
        for (Menu menu : menus) {  
            idToMenuMap.put(menu.getId(), menu);  
        }  
  
        List<Menu> rootMenus = new ArrayList<>(); // 存放根节点  
  
        for (Menu menu : menus) {  
            if (menu.getParentId() == 0) { // 假设parentId为0的是根节点  
                rootMenus.add(menu);  
            } else {  
                Menu parentMenu = idToMenuMap.get(menu.getParentId());  
                if (parentMenu != null) {  
                    parentMenu.getChildren().add(menu);  
                }  
            }  
        }  
  
        return rootMenus;  
    }  
  
    // 遍历并打印菜单树的方法  
    public void printMenuTree(String prefix) {  
        System.out.println(prefix + name);  
        for (Menu child : children) {  
            child.printMenuTree(prefix + "--");  
        }  
    }  
  
    // 主方法,用于测试  
    public static void main(String[] args) {  
        // 创建菜单列表  
        List<Menu> menus = Arrays.asList(  
            new Menu(1, "菜单1", 0), // 根节点  
            new Menu(2, "菜单2", 1),  
            new Menu(3, "子菜单1", 2),  
            new Menu(4, "子菜单2", 2),  
            new Menu(5, "菜单3", 0), // 另一个根节点  
            new Menu(6, "子菜单3", 5)  
        );  
  
        // 构建菜单树  
        List<Menu> menuTree = buildMenuTree(menus);  
  
        // 遍历并打印菜单树  
        for (Menu rootMenu : menuTree) {  
            rootMenu.printMenuTree("");  
        }  
    }  
}

在这个例子中,buildMenuTree方法首先创建了一个id到Menu对象的映射,这样我们可以快速找到每个菜单项的父菜单项。然后,它遍历原始菜单列表,将根节点(parentId为0的节点)添加到rootMenus列表中,并将其他节点添加到其对应父节点的children列表中。最后,它返回包含所有根节点的列表。

printMenuTree方法是一个递归方法,用于遍历并打印菜单树。它首先打印当前菜单项的名称,然后对其每个子菜单项调用自身。

请注意,这个实现假设parentId为0的菜单项是根节点。如果你的数据结构不同,你需要调整buildMenuTree方法来适应你的具体情况。此外,如果原始菜单列表很大,那么这种方法可能不是最高效的,因为它需要多次遍历列表。对于大型数据集,你可能需要考虑使用更复杂的数据结构或算法来优化性能。

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现多级菜单管理可以通过Mybatis的递归查询实现,具体步骤如下: 1. 定义菜单实体类,包含id、name、parentId、url等属性。 2. 定义菜单Mapper接口,在接口中定义递归查询方法,如下所示: ```java public interface MenuMapper { // 查询指定父级菜单下的所有子菜单 List<Menu> listByParentId(Integer parentId); // 递归查询指定父级菜单下的所有子菜单 List<Menu> listByParentIdRecursive(Integer parentId); } ``` 3. 在Mapper.xml文件中实现递归查询方法,如下所示: ```xml <mapper namespace="com.example.mapper.MenuMapper"> <!-- 查询指定父级菜单下的所有子菜单 --> <select id="listByParentId" resultType="com.example.entity.Menu"> select * from menu where parent_id = #{parentId} </select> <!-- 递归查询指定父级菜单下的所有子菜单 --> <select id="listByParentIdRecursive" resultType="com.example.entity.Menu"> with recursive cte(id, name, parent_id, url) as ( select id, name, parent_id, url from menu where parent_id = #{parentId} union all select c.id, c.name, c.parent_id, c.url from menu c join cte on c.parent_id = cte.id ) select * from cte </select> </mapper> ``` 4. 在Java代码中调用递归查询方法,如下所示: ```java @Autowired private MenuMapper menuMapper; public List<Menu> listByParentIdRecursive(Integer parentId) { return menuMapper.listByParentIdRecursive(parentId); } ``` 5. 在Controller中编写菜单管理方法,如下所示: ```java @Autowired private MenuService menuService; // 查询所有菜单 @GetMapping("/menu") public List<Menu> listMenu() { return menuService.listByParentIdRecursive(null); } // 新增菜单 @PostMapping("/menu") public void addMenu(@RequestBody Menu menu) { menuService.addMenu(menu); } // 修改菜单 @PutMapping("/menu") public void updateMenu(@RequestBody Menu menu) { menuService.updateMenu(menu); } // 删除菜单 @DeleteMapping("/menu/{id}") public void deleteMenu(@PathVariable("id") Integer id) { menuService.deleteMenu(id); } ``` 使用以上方法,可以方便地实现多级菜单管理。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值