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>

加入之后运行得到树状结构:

 


posted @   浮笙芸芸  阅读(330)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
点击右上角即可分享
微信分享提示