使用递归方法查询所有分类(一)

使用递归方法查询所有分类(一)

###递归的方法在很多项目中的很多场景中都会用到,很多教学都拿一些阶乘啊,从1加到100之类的来举例,但对于不懂递归原理的新猿来说,看完这些例子往往不能够做到举一反三,也应用不到项目实践中去。所以我这里举一个项目中会常用到的实例来加深大家的理解~

一、需求分析

大家经常会遇到这样一个场景:根据分类名称查询这个分类及子类下的所有相关文档。这个需求看似很简单,只需要一个findByType(String type)的方法,或者在findAll的时候对type这个参数做判空即可。其实不然,因为一般情况下,文档会放在一个最低级的分类下,也就是这个分类下在没有子类,这样查出来是没有问题的,但是当用户选择一个父类时,你会发现,这个父类下面根本没有关联文档,此时,就需要根据这个父类去查它下面的子类,再继续查结果集中的子类,如果是无限子集,就要查到再无子类时才能终止,然后再用刚查询到的所有分类去查找它们下面的相关文档。此时,就需要用到递归方法了,因为递归方法就是为处理重复操作而生的~

二、代码实现

话不多说,直接上源码:

public class ContentService {
    
    

	//查询文档的mapper
	@Autowired
	ContentMapper mapper;
	
	//查询分类的mapper
	@Autowired
	ContentTypeMapper typemapper;
	

	public List<KnowledgeContent> findAll(Integer start,Integer end,String mytype,Date starttime,Date endtime){
    
    
		List<KnowledgeContent> lists = new ArrayList<KnowledgeContent>();
		//递归查询所有分类
		List<KnowledgeContentType> childType = getChildType(mytype);
		System.out.println("递归的结果是:"+childType.toString());
		for (int i = 0; i < childType.size(); i++) {
    
    
			List<KnowledgeContent> list = mapper.findAll(start, end, childType.get(i).getId(), starttime, endtime);
			for (int j = 0; j < list.size(); j++) {
    
    
				lists.add(list.get(j));
			}
		}
		return lists;
	}
	
	/*
	 * 递归方法
	 */
	private List<KnowledgeContentType> getChildType(String superid) {
    
    
		System.out.println("我来递归查询了");		
		List<KnowledgeContentType> childtype = typemapper.findBySuperid(superid);
		if (childtype.size() != 0) {
    
    
			for (int i = 0; i < childtype.size(); i++) {
    
    
				if (typemapper.findBySuperid(childtype.get(i).getId()).size() != 0) {
    
    
					List<KnowledgeContentType> li = getChildType(childtype.get(i).getId());
					for (int j = 0; j < li.size(); j++) {
    
    
						childtype.add(li.get(j));
					}
				}
			}
		}
		return childtype;
	}

findAll()方法中的start,end是做分页用的,starttime,endtime是做时间区间查询用的,这四个参数讲的递归查询方法没有任何关系,大家可以不用关注它们。

当用户传一个mytype(分类id)进来时,我们直接调用下面写得递归方法,即getChildType(),调这个方法后,递归第一步,先使用findBySuperid()查询这个id下有没有子类,然后对查询到的结果做判断,如果不为空,则将查询到的子类的id作为superid继续查,继续查的时候,直接调用递归方法自身,也就是自己调自己,直到查出来结果为null后停止查询,此时所有查询到的结果都被这个childType给add进去了,所以把childType返回即可,拿到了所有的分类,去遍历分类,查询文档即可。

新猿可能对这个逻辑会感到烧脑,但是逐步的去按照这个逻辑去看代码的每一个步骤走到了哪里,就会有恍然大悟的感觉!哈哈~

如果有看不明白的地方,咱评论区见~~

如果觉得有用,请给老弟点个赞!哈哈,下期抽空写一个递归拼接树结构

猜你喜欢

转载自blog.csdn.net/DDDHL7/article/details/111573308