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

时间:2024-04-30 17:27:25

在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方法来适应你的具体情况。此外,如果原始菜单列表很大,那么这种方法可能不是最高效的,因为它需要多次遍历列表。对于大型数据集,你可能需要考虑使用更复杂的数据结构或算法来优化性能。

相关文章