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

server/2024/9/24 13:21:04/

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

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

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


http://www.ppmy.cn/server/24694.html

相关文章

面试中算法(最小栈)

最小栈的实现 实现一个栈&#xff0c;该栈有出栈(pop&#xff09;、入栈(push)、取最小元素(get_min) 。要保证时间复杂度都是O (1&#xff09;。 第1步&#xff1a;设原有的栈叫作栈A&#xff0c;额外的“备胎”栈B&#xff0c;用于辅助栈A。 当第1个元素进入栈A时&#xff0c…

小长假来临,企业借助巡检系统做好安全巡查工作

节前节后是安全隐患事故多发期&#xff0c;小长假来了&#xff0c;企业面临着员工离岗、生产活动减少等特殊情况&#xff0c;这可能导致一些安全隐患被忽视。因此&#xff0c;借助巡检系统做好全面安全巡查工作显得尤为重要。巡检系统可以帮助企业实现巡检工作的规范化、标准化…

如何解决Go中uint类型溢出问题

如何解决Go中uint类型溢出问题 Golong的uint类型溢出问题通常会发生在大量的运算中&#xff0c;特别是涉及到大量循环和大数运算中。当uint类型的值超过其最大值时&#xff0c;会发生溢出&#xff0c;从最小值开始循环&#xff0c;一般有如下几种解决办法&#xff1a; 1. 使用…

【源码】纳斯达克微盘系统源码/PHP微交易源码/支持中英文/域名检测/等等功能

源码描述&#xff1a; 这个感觉以前发过也就那样吧&#xff0c;k线好像不行。 值得借鉴学习 具体自己研究吧 CD&#xff1a;获取方式联系小编 微信&#xff1a;uucodes 公众号&#xff1a;资源猿 小编提供资源代找&#xff0c;环境搭建&#xff0c;源码部署调试等业务&#x…

安装一个mysql5.7.37版本的数据库应用,端口映射到本机的3306端口

好的&#xff0c;以下是在 Docker 中安装 MySQL 5.7.37 并将其端口映射到本机的 3306 端口的步骤&#xff1a; 1. 拉取 MySQL 5.7.37 镜像&#xff1a; 首先&#xff0c;使用以下命令从 Docker Hub 拉取 MySQL 5.7.37 镜像&#xff1a; docker pull mysql:5.7.372. 运行 MyS…

Qt下使用7Z源码进行压缩和解压缩

7Z压缩是一款常用的压缩算法和工具&#xff0c;本文主要介绍一款在qt环境下进行编译的压缩方法。 本人测试是可以正常跑通的&#xff0c;具体代码部分请下载&#xff1a;下载链接&#xff0c;提取码&#xff1a;ev9t 7z源码网址&#xff1a;7-Zip 7z简介&#xff1a; 7z 是…

Docker备忘清单(四)

阅读本文你将获得什么 理解Java是什么 了解面向过程思想 面向过程思想的实战操作 文末资源链接 注&#xff1a;文章字数&#xff1a;1w&#xff0c;阅读可能需要花费5-10分钟 随着年龄的增长&#xff0c;记性开始退步&#xff0c;所以接下来打算把常用的一些语言命令&…

MySQL中SELECT语句的执行过程

2.1.1. 一条SELECT语句的执行过程 MySQL 的架构共分为两层&#xff1a;Server 层和存储引擎层 Server层负责建立连接、分析和执行SQL存储引擎层负责数据的存储和提取&#xff0c;支持 InnoDB、MyISAM、Memory 等多个存储引擎&#xff0c;MySQL5.5以后默认使用InnoDB&#xff0…