首页 > 编程语言 >java中用递归实现树形结构

java中用递归实现树形结构

时间:2023-02-19 16:13:43浏览次数:27  
标签:java 递归 Menu list rootMenu add 树形 new 节点

本文以一个多级菜单的案列描述了在java中如何用递归来组装树形结构的数据。

java中生成树形结构主要分为两步,

(1) 在源数据list中找到所有的根节点

(2) 递归为每一个根节点找到其所有的子节点

下面就用代码来实现下。

首先建立描述菜单结构的实体类

public class Menu {
    private String id;
    private String parentId;
    private String name;
    private List<Menu> children;
  // 省略get/set,构造方法
}

然后是测试类

public class Main {
    public static void main(String[] args) {
        //构造测试数据
        Menu menu1 = new Menu("1",null,"1");
        Menu menu2 = new Menu("1-1","1","1");
        Menu menu3 = new Menu("1-1-1","1-1","1-1-1");
        Menu menu4 = new Menu("2",null,"2");
        Menu menu5 = new Menu("2-1","2","2-1");
        Menu menu6 = new Menu("2-1-1","2-1","2-1-1");
        Menu menu7 = new Menu("1-2","1","1-2");

        List<Menu> list = new ArrayList<>();
        list.add(menu1);
        list.add(menu2);
        list.add(menu3);
        list.add(menu4);
        list.add(menu5);
        list.add(menu6);
        list.add(menu7);

        //生成树的方法
        List<Menu> tree = createTree(list);
        System.out.println(tree);
    }

    //构造树形结构
    public static List<Menu> createTree(List<Menu> sourceList){
        List<Menu> list = new ArrayList<>();
        for (Menu menu : sourceList) {
            //找到根节点进行处理,找下一级节点
            if(null == menu.getParentId()){
                //把所有的根节点放到一个list
                list.add(findChildren(menu,sourceList));
            }
        }

        return list;
    }

    public static Menu findChildren(Menu rootMenu,List<Menu> list){
        //这个方法是在找rootMenu的所有子节点,然后返回rootMenu
        for (Menu menu : list) {
            if(rootMenu.getId().equals(menu.getParentId())){
                if(rootMenu.getChildren() == null){
                    rootMenu.setChildren(new ArrayList<>());
                }
                // 把这个节点menu作为新的根节点继续向下构造树,再把构造的结果作为rootMenu的子节点
                rootMenu.getChildren().add(findChildren(menu,list));
            }
        }

        return rootMenu;
    }
}

上边的代码中先找到所有的根节点,再通过findChildren方法为每一个根节点找到所有的子节点,最终形成一个树形结构。

标签:java,递归,Menu,list,rootMenu,add,树形,new,节点
From: https://www.cnblogs.com/chengxuxiaoyuan/p/17134901.html

相关文章

  • Java 接口
    目录1、接口的概念2、接口的定义3、接口的使用4、接口和抽象类1、接口的概念类是一种具体的实现体,而接口定义了一种规范(抽象方法),接口定义了某一批类所需要遵循的规范,接口......
  • Java 内部类
    目录1、初识内部类2、非静态内部类(实例内部类)3、静态内部类(重点)4、内部类的使用5、局部内部类6、匿名内部类1、初识内部类如果一个事物的内部包含另一个事物,那么这是一个......
  • 61-CICD持续集成工具-Jenkins自动化部署JAVA程序
    BlueOcean插件实现可视化注意:安装完插件,需要重启Jenkins才能生效参数化构建执行命令脚本[root@jenkinsscript]#catwheel-deploy-rollback.sh#!/bin/bash##*********......
  • java的filter如何实现utf-8编码转换
    importjavax.servlet.*;importjavax.servlet.annotation.WebFilter;importjavax.servlet.http.HttpServletRequest;importjava.io.IOException;@WebFilter("/*")......
  • 深入理解Java字符串常量池
    “先从这道面试题开始吧!”Strings=newString("二哥");“这行代码创建了几个对象?”“不就一个吗?”三妹不假思索地回答。“不,两个!”我直接否定了三妹的答案,“使用ne......
  • Java如何判断两个字符串是否相等?
    “这个问题也可以引申为.equals()和‘==’操作符有什么区别。”.equals()就好像我们普通人,看见阿丽塔以为是洛丽塔,看见洛丽塔以为是阿丽塔,看起来一样就觉得她们是同......
  • Java字符串拼接
    “哥,你让我看的《Java开发手册openinnewwindow》上有这么一段内容:循环体内,拼接字符串最好使用StringBuilder的append()方法,而不是+号操作符。这是为什么呀?”三妹......
  • Java字符串分割
    “哥,我感觉字符串拆分没什么可讲的呀,直接上String类的split()方法不就可以了!”三妹毫不客气地说。“假如你真的这么觉得,那可要注意了,事情远没这么简单。”我微笑着说......
  • 漏洞分析-log4j RCE-JAVA篇
    0x00原理分析log4j的介绍:log4j是java打印输出日志的一个API,只要引入了log4j的jar包或者是在xml配置文件内配置好log4j即可输入java运行时产生的日志内容,一般用于记录网......
  • Java入门博客
    开始准备 新建一个file->new->project->emptyproject   新建一个file->new->module->java 打开projectstructure,修改这两处   修改注释的颜色 ......