使用递归方法拼接分类树结构(二)

使用递归方法拼接分类树结构

上一个递归方法讲的是使用递归方法查询所有分类下的文档,这种方式查出来的结果是一个列表,不便于区分层级关系。今天来讲一个树结构的拼接方法,也就是通过父id查询子类,将子类的结果集拼接到父类下面,再查子类的子类,无限的查下去,查到null为止,拼接起来的结果,像一颗树的结构一样有粗有细有分支,哈哈~

一、逻辑分析

以创建分类的树结构为例,所有的类型,都有自己的id和superid(父id),我们只要根据superid查询它下面有没有子类id,如果有,再将子类的id作为新的superid继续查,一直查到null为止,然后将所有查到的结果拼接成一层套一层的结构即可,结果例如下图的这个样纸~:
在这里插入图片描述
这里可能有人会问,如果是第一级分类,那它的superid是啥呢?问的好,我们在录入分类的时候,如果是第一级分类,我们随便给所有的一级分类给一个统一的superid即可,比如我给的就是“0”,也就是我们递归的时候,从superid=“0”开始往下查就行了~。

二、代码实现

树结构的代码,只要想通了逻辑,其实非常简单,话不多说,源码走起~

1、controller层

这里我多加了一个totalCount,是为了统计一下一共有多少个分类,OutgoingUtils是我自己封装的一个返回方式而已,这两个都可以忽略,忽略完之后,其实controller就是一行代码:service.getTypeTree();

	//类型树结构
	@RequestMapping(value = "/getTypeTree",method = RequestMethod.GET)
	public Map<String,Object> getTypeTree(){
		
		List<Map<String,Object>> list = service.getTypeTree();
		
		Integer totalCount = service.totalCount();
		
		return OutgoingUtils.OutgoingParameterPage("200", list, totalCount);
	}

2、service层

我们在service层来写递归逻辑

	public List<Map<String,Object>> getTypeTree(){
		
		return childType("0");
	}
	
	//递归方法
	private List<Map<String,Object>> childType(String superid){
		List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();
		List<KnowledgeContentType> childList = mapper.findBySuperid(superid);
		if (childList.size() != 0) {
			for (int i = 0; i < childList.size(); i++) {
				Map<String,Object> map = new HashMap<String,Object>();
				map.put("id", childList.get(i).getId());
				map.put("name", childList.get(i).getName());
//				map.put("superid", childList.get(i).getSuperid());
//				map.put("mystate", childList.get(i).getMystate());
//				map.put("createdate", childList.get(i).getCreatedate());
//				map.put("discription", childList.get(i).getDiscription());
				map.put("children", childType(childList.get(i).getId()));
				
				list.add(map);
			}
			
		}
		return list;
	}

getTypeTree()方法中,就传了个一级分类的superid=“0”,然后进入到递归方法中自己调自己玩一阵子,就把树结构返回给controller了,是不是很easy~

3、mapper层

	@Select("select * from cx_knowledge_content_type where superid=#{superid,jdbcType=VARCHAR}")
	public List<KnowledgeContentType> findBySuperid(@Param("superid") String superid);

整个递归方法,就用到了一个findBySuperid方法,是不是比想象中的容易多了~

4、调用结果

{"code":"200","body":[{"children":[{"children":[{"children":[{"children":[],"name":"榨汁机","id":"5"},{"children":[],"name":"电火锅","id":"4"}],"name":"厨房电器","id":"3"}],"name":"家用电器","id":"2"}],"name":"电器","id":"1"}],"message":"success","totalCount":5}

可用将结果复制到https://www.json.cn/中展示结果。

三、拓展

我在做这个递归的时候,用的是List<Map<String,Object>>,在遍历子集的时候,用一个map去放想放的结果,这个是很常用的,建议大家多用用。
如果不使用List<Map<String,Object>>也可以做到树结构,那就是在实体类里面增加一个参数,比如我们的实体类叫ContentType,那么再加一个类型为List< ContentType>的,名称比方说叫childType的参数,给它get、set方法,然后在递归的过程中,将子集放到这个childType中就好了~两种方法没有好坏,就看自己喜欢那个就用哪个就好了!

如果有不懂的地方,欢迎评论区留言!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

每天只想静静

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值