五分钟教你学会递归
一、什么是递归?
初次听到这个词语的时候,想必大家都很不理解,什么是递归呢?举个简单的例子,很多人都看过电影《盗梦空间》吧。其实这个电影讲的就是个递归的例子,人做梦一层一层的进入了多重梦境,然后达到某种条件时,梦就会中断。递归就是同一个事物不断地重复进入到同一种状态,当达到某种条件时,这种状态就会终止,跳出来。
废话不多说,上代码!更好理解
二、递归可以用来做什么?
递归多用于实现树的分层结构,比如部门下有多个部门,多个部门下每个部门又有多个部门;文件夹下有多个文件夹,每个文件夹下有出现多个文件夹或文件;你有多个文件夹,想要给这些文件夹进行归类时,那么递归是种不错的选择!
文件夹结构图:
三、使用递归归类文件夹
图中的Category是文件夹对象,该类属性如下:
private long id;
/**
* 类别名称
*/
private String categoryName;
/**
* 排序id
*/
private Integer orderId;
/**
* 上级id
*/
private Integer parentId;
/**
* 文件夹集合,一个文件夹可能会包含有多个文件夹
*/
private List<CategoryDto> children = new ArrayList<>();
调用此方法,对文件夹归类
@GetMapping(value = "/getCategoryTree")
public RestResult getCategoryTree() {
RestResult restResult = new RestResult();
//获取一级父类文件夹
List<Category> cateParentsDto = iCategoryService.findByParentId(0);
//获取所有分类文件夹(其中包括父类与子类文件夹)
List<Category> categoryDtoAllList=iCategoryService.getAllCategory(null);
for (Category Category:cateParentsDto) {
getCategoryToTree(Category,categoryDtoAllList);//递归的方法
}
restResult.setData(cateParentsDto);
return restResult;
}
递归将分类文件夹进行归类
public void getCategoryTree(Category category,List<Category> categoryAllList) {
for (Category cate : categoryAllList) {
//判断,如果父类文件夹id与集合中的某个文件夹的父类id相同,则进入判断内部
if (category.getId()==cate .getParentId()){
//该步为代码的核心,判断cate对象中是否有Children集合(多个文件夹),进行递归。
getCategoryToTree(cate , categoryAllList);
category.getChildren().add(cate );//表示该文件夹是category的子文件夹,所以要添加到Category类的Children集合中
}
}
}
其实,使用递归很简单,就是无限的调用同一种方法,直到达到某个条件时,终止递归。如有问题,欢迎小伙伴们的提问。