目录数据整理为树形结构

背景

对于目录结构的存储,数据库里一般用一张表中的关联id(如父节点的id)来表示关系,如下即为一个目录表的表结构:

CREATE TABLE `pms_category` (
  `cat_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '分类id',
  `name` char(50) DEFAULT NULL COMMENT '分类名称',
  `parent_cid` bigint(20) DEFAULT NULL COMMENT '父分类id',
  `cat_level` int(11) DEFAULT NULL COMMENT '层级',
  `show_status` tinyint(4) DEFAULT NULL COMMENT '是否显示[0-不显示,1显示]',
  `sort` int(11) DEFAULT NULL COMMENT '排序',
  `icon` char(255) DEFAULT NULL COMMENT '图标地址',
  `product_unit` char(50) DEFAULT NULL COMMENT '计量单位',
  `product_count` int(11) DEFAULT NULL COMMENT '商品数量',
  PRIMARY KEY (`cat_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1433 DEFAULT CHARSET=utf8mb4 COMMENT='商品三级分类';

下面将这样一个表表示的目录关系做还原,生成一个树结构的目录。

实现

@Override
public List<CategoryEntity> listWithTree() {
    //从数据库中查出所有的数据
    List<CategoryEntity> categoryEntities = baseMapper.selectList(null);
    //将数据组成树形结构
    //1.筛选出根元素
    //利用stream函数来过滤和处理
    List<CategoryEntity> root = categoryEntities.stream().filter(tmp ->
        tmp.getParentCid() == 0
    ).map(tmp1 -> {
        //设置子节点
        tmp1.setChildren(getChildrens(tmp1, categoryEntities));
        return tmp1;
    }).sorted((val1, val2) -> {
        //排序,正序
        return val1.getSort() - val2.getSort();
    }).collect(Collectors.toList());  //将流转换成集合

    return root;
}

//冲all中查找所有root的子节点,方法内是递归查找
private List<CategoryEntity> getChildrens(CategoryEntity root, List<CategoryEntity> all) {
    List<CategoryEntity> children = all.stream().filter(tmp ->
        tmp.getParentCid() == root.getCatId()
    ).map(tmp1 -> {
        //此处递归查找所有子节点的子节点
        tmp1.setChildren(getChildrens(tmp1, all));
        return tmp1;
    }).sorted((val1, val2) -> {
        return (val1.getSort() == null ? 0 : val1.getSort()) - (val2.getSort() == null ? 0 : val2.getSort());
    }).collect(Collectors.toList());
    return children;
}

效果

目录结构

posted @ 2021-03-15 23:52  bGpi  阅读(285)  评论(0)    收藏  举报