树的构造方式之一
树节点
@Data public class Tree { /** * 节点id */ private String id; /** * 节点父id */ private String pid; /** * 节点名称 */ private String name; @Override public String toString() { return "Tree [id=" + id + ", pid=" + pid + ", name=" + name + "]"; } }
树菜单处理
/** * 递归类 (菜单树) * * @author ztw * @date 2023/6/30 */ public class MenuTree { public MenuTree(List<Tree> trees) { menuList(trees); } /** * 临时变量,记录传入的节点 */ private List<Tree> menuCommon; /** * 待返回的菜单树对象集 */ private List<Object> list = new ArrayList<Object>(); /** * 提供接口获取菜单树 * * @return 菜单树 */ public List<Object> getList() {return list;} /** * 组装菜单树 * 组装了的菜单树 存有第一级节点,每个节点又包含子节点集 * * @param menu 数据集 */ private void menuList(List<Tree> menu) { this.menuCommon = menu; for (Tree x : menu) { // LinkedHashMap 双向链表 Map<String, Object> mapArr = new LinkedHashMap<String, Object>(); // 如果父级是0 if (x.getPid() == "0") { mapArr.put("id", x.getId()); mapArr.put("name", x.getName()); mapArr.put("pid", x.getPid()); mapArr.put("childList", menuChild(x.getId())); list.add(mapArr); } } } /** * 递归获取 * 组装id鱼id的子集 * * @param id 父级 * @return id的子节点集 */ private List<?> menuChild(String id) { List<Object> lists = new ArrayList<Object>(); // 遍历全集,找pid=id的节点,也就是id的子节点 for (Tree a : menuCommon) { Map<String, Object> childArray = new LinkedHashMap<String, Object>(); // id 的子节点 有子节点才会进入,不然就结束方法递归了 if (a.getPid() == id) { childArray.put("id", a.getId()); childArray.put("name", a.getName()); childArray.put("pid", a.getPid()); // 组装id的字节点的时候,也组装该子节点的子节点集 childArray.put("childList", menuChild(a.getId())); lists.add(childArray); } } // id的子节点对象集 return lists; } }
测试
@Test public void methodNameTest() { List<Tree> data = new ArrayList<Tree>(); // 获取节点数据 Tree tree = new Tree(); tree.setId("1"); tree.setPid("0"); tree.setName("系统管理"); data.add(tree); tree = new Tree(); tree.setId("2"); tree.setPid("1"); tree.setName("管理员列表"); data.add(tree); tree = new Tree(); tree.setId("3"); tree.setPid("2"); tree.setName("新增管理员"); data.add(tree); tree = new Tree(); tree.setPid("0"); tree.setId("4"); tree.setName("导览管理"); data.add(tree); tree = new Tree(); tree.setId("5"); tree.setPid("4"); tree.setName("POI管理"); data.add(tree); System.out.println(data.toString()); // 菜单树 List<Object> list = new MenuTree(data).getList(); // System.out.println(list.toString()); // 将集合转换为JSON数组 System.out.println(JSONArray.toJSON(list)); }
作者: deity-night
出处: https://www.cnblogs.com/deity-night/
关于作者:码农
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出, 原文链接 如有问题, 可邮件(***@163.com)咨询.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具