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     }
  • 相关阅读:
    Invalid command 'RewriteEngine'解决办法
    JEZ reCAPTCHA 谷歌验证码插件及使用方法
    一段图片预加载的代码
    Fancybox
    Silverlight4 beta 中的.net ria service自定义用户身份验证之改变
    .net ria service 数据验证(7)
    .net ria services 自定义函数(9)
    C#开发ActiveX控件及制作CAB包
    Silverlight 3.0 中的 Local Connection
    Silverlight3端操作数据库(5)
  • 原文地址:https://www.cnblogs.com/Demrystv/p/13411251.html
Copyright © 2011-2022 走看看