使用java递归实现列表层级显示


分享,欢迎批评指正,谢谢~

结构类似如下(无限级):

  • 工程1
    • 子工程1.1
      • 孙工程1.1.1
      • 孙工程1.1.2
    • 子工程1.2
    • 子工程1.3
  • 工程2
    • 子工程2.1
      • 孙工程2.1.1
      • 孙工程2.1.2

model层

//数据库表中字段相同
public class Eng{
    private Long engId;
    private String engName;
    private Long engPid;
    //get set自行添加,此处省略
}

自定义DTO类

在model字段基础上加入childrenList

public class EngChildrenDTO{
    private Long engId;
    private String engName;
    private Long engPid;
    private List<EngChildrenDTO> childrenList;
   //get set自行添加,此处省略
}

service层

    public List<EngChildrenDTO> engList() {
        //查询出所有的工程(line 1~line5)
        //因为本案例使用了MyBatis Generator自动生成model类、dao层的mapper类、*DynamicSqlSupport动态语句支持类
        //所以该案例"查询所有工程"时使用MyBatis3 DynamicSql写法,可相应地替换成您项目中使用的其他方式来实现"查询出所有的工程"
        SelectStatementProvider render = select(EngDynamicSqlSupport.eng.allColumns())
                .from(EngDynamicSqlSupport.eng)
                .where(EngDynamicSqlSupport.deleteFlag, isEqualTo(0))
                .build().render(RenderingStrategies.MYBATIS3);
        List<Eng> allEngs = engMapper.selectMany(render);
        
        //遍历查询出来的所有工程allEngs ,赋值给engChildrenDTO,并add到root
        ArrayList<EngChildrenDTO> root = new ArrayList<>();//用于存放所有工程
        for (Eng allEng : allEngs) {
            EngChildrenDTO engChildrenDTO = new EngChildrenDTO();
            BeanUtils.copyProperties(allEng, engChildrenDTO);//给riskEngChildrenDTO赋值
            root.add(engChildrenDTO);
        }
        
        //遍历root 找到所有的一级工程,add到finalList
        List<EngChildrenDTO> finalList = new ArrayList<>();//用于存放一级工程
        for (EngChildrenDTO eng : root) {
            if (StringUtils.isEmpty(eng.getEngPid())) {//一级工程(pid为空)
                finalList.add(eng);
            }
        }
        
        // 遍历一级工程,为一级工程设置子工程( 调用下方定义的递归体getChild() )
        for (EngChildrenDTO eng : finalList) {
            eng.setChildrenList(getChild(eng.getEngId(), root));
        }
        
        return finalList;
    }
    //递归体,主方法中进行循环调用
    private List<EngChildrenDTO> getChild(Long id, List<EngChildrenDTO> root) {
        //遍历传入的root,pid不为空(即不是一级工程) 且此工程pid等于传过来的工程的id时,加入childList 
        List<EngChildrenDTO> childList = new ArrayList<>(); //用于存放子工程
        for (EngChildrenDTO engChildrenDTO : root) {
            if (!StringUtils.isEmpty(engChildrenDTO.getEngPid())) {
                if (engChildrenDTO.getEngPid().equals(id)) {
                    childList.add(engChildrenDTO);
                }
            }
        }
        
        //递归终止的条件(没有子工程时)
        if (childList.size() == 0) {
            return null;
        }
        
        //如果有子工程还有子工程,遍历childList,继续进行递归调用
        for (EngChildrenDTO engChildrenDTO : childList) {
           engChildrenDTO.setChildrenList(getChild(engChildrenDTO.getEngId(), root));
        }
        
        return childList;
    }

结果展示

{
  "status": true,
  "data": [
    {
      "engId": "1388436330181062657",
      "engName": "工程1",
      "engPid": null,
      "childrenList": [
        {
          "engId": "1390277587912224770",
          "engName": "子工程1.1",
          "engPid": "1388436330181062657",
          "childrenList": [
            {
              "engId": "1391568088810614785",
              "engName": "孙工程1.1",
              "engPid": "1390277587912224770",
              "childrenList": null
            }
          ]
        },
        {
          "engId": "1390276723344535553",
          "engName": "子工程1.2",
          "engPid": "1388436330181062657",
          "childrenList": null
        }
      ]
    },
    {
      "engId": "1390994842794659842",
      "engName": "工程2",
      "engPid": null,
      "childrenList": [
        {
          "engId": "1391571581688590337",
          "engName": "子工程2.1",
          "engPid": "1390994842794659842",
          "childrenList": null
        },
        {
          "engId": "1391568182108712961",
          "engName": "子工程2.2",
          "engPid": "1390994842794659842",
          "childrenList": [
            {
              "engId": "1391572327666483201",
              "engName": "孙工程2.2.1",
              "engPid": "1391568182108712961",
              "childrenList": [
                {
                  "engId": "1392450583207936001",
                  "engName": "孙工程2.2.2",
                  "engPid": "1391572327666483201",
                  "childrenList": null
                }
              ]
            }
          ]
        }
      ]
    }
  ],
  "code": 8000000,
  "message": "成功",
  "txId": "null"
}
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是使用Java实现递归方式实现菜单层级关系的代码示例: ```java public class MenuItem { private int id; private String name; private String url; private List<MenuItem> subMenu; // 省略构造方法和get、set方法 public String toHtml() { StringBuilder sb = new StringBuilder(); sb.append("<li><a href=\"").append(url).append("\">").append(name).append("</a>"); if (subMenu != null && subMenu.size() > 0) { sb.append("<ul>"); for (MenuItem subMenuItem : subMenu) { sb.append(subMenuItem.toHtml()); } sb.append("</ul>"); } sb.append("</li>"); return sb.toString(); } } ``` 在上述代码中,`MenuItem` 表示菜单项的数据结构,包含菜单项的 ID、名称、URL 等信息,以及一个子菜单的列表。`toHtml()` 方法用于将菜单项及其子菜单转换为 HTML 代码。 在 `toHtml()` 方法中,我们首先将当前菜单项的名称和 URL 生成为一个菜单项的 HTML 代码,并将其添加到 `StringBuilder` 对象中。然后,如果当前菜单项有子菜单,就递归地调用 `toHtml()` 方法,将子菜单转换为 HTML 代码,并将其添加到 `StringBuilder` 对象中。最后,将整个菜单项的 HTML 代码作为字符串返回。 下面是使用示例: ```java public static void main(String[] args) { MenuItem menuItem1 = new MenuItem(1, "菜单1", "/menu1", null); MenuItem menuItem2 = new MenuItem(2, "菜单2", "/menu2", null); MenuItem menuItem3 = new MenuItem(3, "菜单3", "/menu3", null); MenuItem subMenuItem1 = new MenuItem(4, "子菜单1", "/subMenu1", null); MenuItem subMenuItem2 = new MenuItem(5, "子菜单2", "/subMenu2", null); MenuItem subMenuItem3 = new MenuItem(6, "子菜单3", "/subMenu3", null); List<MenuItem> subMenuItems = new ArrayList<>(); subMenuItems.add(subMenuItem1); subMenuItems.add(subMenuItem2); subMenuItems.add(subMenuItem3); MenuItem menuItem4 = new MenuItem(7, "菜单4", "/menu4", subMenuItems); List<MenuItem> menuItems = new ArrayList<>(); menuItems.add(menuItem1); menuItems.add(menuItem2); menuItems.add(menuItem3); menuItems.add(menuItem4); for (MenuItem menuItem : menuItems) { System.out.println(menuItem.toHtml()); } } ``` 输出结果如下: ```html <li><a href="/menu1">菜单1</a></li> <li><a href="/menu2">菜单2</a></li> <li><a href="/menu3">菜单3</a></li> <li><a href="/menu4">菜单4</a><ul><li><a href="/subMenu1">子菜单1</a></li><li><a href="/subMenu2">子菜单2</a></li><li><a href="/subMenu3">子菜单3</a></li></ul></li> ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值