zoukankan      html  css  js  c++  java
  • Java递归的方式构造一棵树

      在实际代码开发中,构造一棵树是一个比较常见的业务场景,实现方式有多种多样,但是如何以一种较为优雅的方式构造一棵树,却是一个值得深思的问题。

      下面的方法,整体思路是:

      1)首先查出所有的节点,这样与数据库只交互一次,减少IO;

      2)第二次采用递归的方式构建树;

      3)采用 stream表达式,注意排序的两种实现方式; 代码如下:

     1   public List<CategoryEntity> queryTree() {
     2 
     3         //1. 首先获取所有的实体类
     4         List<CategoryEntity> categoryEntities = baseMapper.selectList(null);
     5 
     6         //2. 组装树形结构
     7         // 特点:
     8         //    1) 首先查出所有的节点,与数据库只交互一次,减少IO
     9         //    2) 然后对查询的节点采用递归的方式进行构造树
    10         List<CategoryEntity> firstMenu = categoryEntities.stream().filter((categoryEntity) -> {
    11             return categoryEntity.getParentCid() == 0;
    12         }).map((menu) -> {
    13             menu.setChildren(getAllChildrenTree(menu, categoryEntities));
    14             return menu;
    15             // 采用这种方式排序,注意非空判断
    16         }).sorted((menu1, menu2) -> {
    17             return (menu1.getSort() == null ? 0 : menu1.getSort()) - (menu2.getSort() == null ? 0 : menu2.getSort());
    18         }).collect(Collectors.toList());
    19 
    20 
    21         return categoryEntities;
    22    }
    23 
    24 
    25     //递归获取所有的子节点
    26     private List<CategoryEntity> getAllChildrenTree(CategoryEntity root, List<CategoryEntity> all) {
    27         List<CategoryEntity> tree = all.stream().filter((categoryEntity) -> {
    28             return categoryEntity.getParentCid() == root.getCatId();
    29         }).map((categoryEntity) -> {
    30             // 递归获取 所有的子菜单
    31             categoryEntity.setChildren(getAllChildrenTree(categoryEntity, all));
    32             return categoryEntity;
    33             //一级菜单正序排列,其他的逆序排列
    34             //采用两种排序方式进行实现,采用这种方式排序,注意非空判断 Comparator.nullsFirst(Integer::compareTo)
    35         }).sorted(Comparator.comparing(CategoryEntity::getSort, Comparator.nullsFirst(Integer::compareTo)).reversed())
    36                 .collect(Collectors.toList());
    37         return tree;
    38     }
  • 相关阅读:
    beeline链接hive报错
    Java并发之FairSync和NonfairSync
    如何在 Linux 中将文件编码转换为 UTF-8
    Spring Boot运行原理
    jvm垃圾回收
    jvm调试工具
    Nginx相关
    docker 配置jar ,运行
    centos7的一些安装问题
    Docker
  • 原文地址:https://www.cnblogs.com/Demrystv/p/13411251.html
Copyright © 2011-2022 走看看