假设业务:店铺系统,每个店铺都有各种商品,商品分几种层级类目,比如:根目录是某某店铺;第一层级目录有数码产品、日用百货等等;第二层级,数码产品下面有笔记本电脑、手机等等;第三层级,笔记本电脑下面有各种品牌。。。
1. 对象准备
1.1 表结构:
主键(目录id) | 创建时间 | 修改时间 | 店铺id | 父目录id | 目录名 | 层级 | 是否删除 |
1 | date | date | 1 | -1 | 某某店铺(因为是根目录,名字和店铺名一样即可) | 0 | N |
2 | date | date | 1 | 1 | 数码产品 | 1 | N |
3 | date | date | 1 | 1 | 日用百货 | 1 | N |
4 | date | date | 1 | 2 | 笔记本电脑 | 2 | N |
5 | date | date | 1 | 4 | 拉里牌电脑 | 3 | N |
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);
}
}