java 使用递归算法快速封装树形结构(简单易懂)
在日常的搬砖生活中,会无法避免的遇到各种各样的Tree,列如:导航栏,组织机构等等。这些数据通常是存储在数据库中,通过parent_id,id进行层级关联,那么如何将这些数据重新封装成Tree结构呢?这里做一个简单的分享。
1,创建实体类
@Data
@ToString
public class CatalogVO {
private Integer id;
private Integer panelsId;
private String catalogName;
private Integer parentId;
private Integer isDeleted;
private String createdUser;
private Date createdTime;
List<CatalogVO> chirldren = new ArrayList<>();
}
创建一个实体类CatalogVO,在实体类中创建一个List 对象,用它来接收chirldren(子节点),并且引入自身作为泛型,如下图箭头处。
2,数据库结构
通过数据库结构可以看出,这里我只是简单的使用parent_id 和 id 进行层级关联。
3,service层
从数据库读取数据,然后使用递归算法将原始数据进行重新封装。
/**
* 获取文档目录的树形结构
* @param panelsId
* @return
*/
@Override
public List<CatalogVO> getDetailTree(int panelsId) {
QueryWrapper<FileCatalog> wrapper = new QueryWrapper<>();
wrapper.eq("panels_id", panelsId);
List<FileCatalog> fileCatalogs = fileCatalogMapper.selectList(wrapper);
List<CatalogVO> lists = new ArrayList<>();
for (FileCatalog fileCatalog : fileCatalogs) {
CatalogVO vo = new CatalogVO();
try {
BeanUtils.copyProperties(vo,fileCatalog);
lists.add(vo);
} catch (IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
}
List<CatalogVO> tree = createTree(lists, 0);
return tree;
}
/**
* 递归建立树形结构 (算法)
* @param lists
* @param pid
* @return
*/
private List<CatalogVO> createTree(List<CatalogVO> lists, int pid) {
List<CatalogVO> tree = new ArrayList<>();
for (CatalogVO catelog : lists) {
if (catelog.getParentId() == pid) {
catelog.setChirldren(createTree(lists,catelog.getId()));
tree.add(catelog);
}
}
return tree;
}
4,前台请求
可以看到,数据已经封装成功,并且正是我所需要的Tree结构。