Java常用写法-类目树的生成与遍历

假设业务:店铺系统,每个店铺都有各种商品,商品分几种层级类目,比如:根目录是某某店铺;第一层级目录有数码产品、日用百货等等;第二层级,数码产品下面有笔记本电脑、手机等等;第三层级,笔记本电脑下面有各种品牌。。。

1. 对象准备

1.1 表结构:

主键(目录id)创建时间修改时间店铺id父目录id目录名层级是否删除
1datedate1-1某某店铺(因为是根目录,名字和店铺名一样即可)0N
2datedate11数码产品1N
3datedate11日用百货1N
4datedate12笔记本电脑2N
5datedate14拉里牌电脑3N

1.2 实体类结构

public class shopDirDO{
    Long id;// 主键,目录id
    Date createTime;// 创建时间
    Date modifiedTime;// 修改时间
    Long directoryParentId;// 父目录id
    String directoryName;// 目录名称
    Long shopId;// 商铺id
    Integer level;// 层级
    String isDeleted;// 是否删除
}

1.3 目录树结构(VO):

public class ShopDirVO{
    Long id;// 目录id
    Long parentDirectoryId;// 父目录id
    String directoryName;// 目录名称
    Integer level;// 层级
    List<ShopDirVO> childrenDirectories;// 子目录信息
}

2. 代码部分

2.1 生成目录树VO对象

// 根据商铺id查出所有目录信息
List<ShopDirDO> dirDOList = Mapper.selectByShopId(shopId);

// 以下是创建目录树
// 创建id->VO map
Map<Long, ShopDirVO> dirIdVOMap = new HashMap();
ShopDirVO dirVOTree = null;
dirDOList.forEach(
    e->{
        // do转vo,详细省略
        ShopDirVO vo = DirConverter.DoToVO(e)
        dirIdVOMap.put(vo.getId(), vo);
    });
// 遍历map
for(Map.Entry<Long, ShopDirVO> entry : dirIdVOMap.entrySet()){
    ShopDirVO vo = entry.getValue();
    if(-1L == vo.getParentDirentoryId()){
        dirVOTree = vo;
        continue;
    }
    ShopDirVO parentVO = dirIdVOMap.get(vo.getParentDirentoryId());
    parentVO.getChildrenDirectories().add(vo);
}

// 得到的dirVOTree就是类目树

2.2 简单遍历案例1

最基本的递归遍历示例,有遍历其他需求的话基本是在此基础上改动。可大致分为两部分,一部分更新想要的数据,一部分递归遍历。

// 根据目录树获取所有目录的id,dirIds变量初始调用时传空
private void fetchDirIdsByDirVO(ShopDirVO tree, Set<Long> dirIds, int level){
    if(dirIds.contains(tree.getId())){
        return;
    }
    dirIds.add(tree.getId());
    for(ShopDirVO vo : tree.getChildrenDirectories()){
        fetchDirIdsByDirVO(vo, dirIds, level+1);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值