java递归实现树结构
先创建实体类,有菜单自己id,父节点parentid,菜单名称text,次级菜单children:
import java.util.List; public class Menu { private String id; private String parentId; private String text; private String url; private String yxbz; private List<Menu> children; public Menu(String id,String parentId,String text,String url,String yxbz) { this.id=id; this.parentId=parentId; this.text=text; this.url=url; this.yxbz=yxbz; } /*省略get\set*/ public String getId() { return id; } @Override public String toString() { return "Menu{" + "id='" + id + '\'' + ", parentId='" + parentId + '\'' + ", text='" + text + '\'' + ", url='" + url + '\'' + ", yxbz='" + yxbz + '\'' + ", children=" + children + '}'; } public void setId(String id) { this.id = id; } public String getParentId() { return parentId; } public void setParentId(String parentId) { this.parentId = parentId; } public String getText() { return text; } public void setText(String text) { this.text = text; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public String getYxbz() { return yxbz; } public void setYxbz(String yxbz) { this.yxbz = yxbz; } public List<Menu> getChildren() { return children; } public void setChildren(List<Menu> children) { this.children = children; } public Menu() { } }
创建树形结构类MenuTree用来返回树形结构的Menu,其中getRootNode通过匹配父节点是否为0来获取所有属于根节点的Menu放入集合,buildChilTree通过递归来查询是否有子树并且将子树逐一放入children中,从而实现树形结构,MenuTree返回得到的树形结构的集合:
import java.util.ArrayList; import java.util.List; public class MenuTree { private List<Menu> menuList = new ArrayList<Menu>(); public MenuTree(List<Menu> menuList) { this.menuList=menuList; } //建立树形结构 public List<Menu> builTree(){ List<Menu> treeMenus =new ArrayList<Menu>(); for(Menu menuNode : getRootNode()) { menuNode=buildChilTree(menuNode); treeMenus.add(menuNode); } return treeMenus; } //递归,建立子树形结构 private Menu buildChilTree(Menu pNode){ List<Menu> chilMenus =new ArrayList<Menu>(); for(Menu menuNode : menuList) { if(menuNode.getParentId().equals(pNode.getId())) { chilMenus.add(buildChilTree(menuNode)); } } pNode.setChildren(chilMenus); return pNode; } //获取根节点 private List<Menu> getRootNode() { List<Menu> rootMenuLists =new ArrayList<Menu>(); for(Menu menuNode : menuList) { if(menuNode.getParentId().equals("0")) { rootMenuLists.add(menuNode); } } return rootMenuLists; } }
最后插入数据并且运行,转换为json输出查看结果:
import com.alibaba.fastjson.JSON; import java.util.ArrayList; import java.util.List; public class Hello { public static void main(String []args) { List<Menu> menuList= new ArrayList<Menu>(); /*插入一些数据*/ menuList.add(new Menu("GN001D000","0","系统管理","/admin","Y")); menuList.add(new Menu("GN001D100","GN001D000","权限管理","/admin","Y")); menuList.add(new Menu("GN001D110","GN001D100","密码修改","/admin","Y")); menuList.add(new Menu("GN001D120","GN001D100","新加用户","/admin","Y")); menuList.add(new Menu("GN001D200","GN001D000","系统监控","/admin","Y")); menuList.add(new Menu("GN001D210","GN001D200","在线用户","/admin","Y")); menuList.add(new Menu("GN002D000","0","订阅区","/admin","Y")); menuList.add(new Menu("GN003D000","0","未知领域","/admin","Y")); /*让我们创建树*/ MenuTree menuTree =new MenuTree(menuList); menuList=menuTree.builTree(); System.out.println(menuList); System.out.println("-----------------------------"); /*转为json看看效果*/ String jsonOutput= JSON.toJSONString(menuList); System.out.println(jsonOutput); } }
这里有两个注意点第一个要在实体类中加入tostring不然输出的就是一串字符,因为list默认是object类型,所以会输出的是Object的地址,也是一个字符串;还有json那部分报红的话是没加入string转json的依赖:
<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.60</version> </dependency>
加入之后运行得到树状结构:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!