Java递归查询子节点集合
最近项目中遇到了一个普通需求,在根据目录节点id查询的时候,要求连带把该目录下的子节点一起查出。以前也做过这种递归的,但是太久没做,一上来,竟然差点给自己搞懵了。所以决定记录下来,供自己以后查阅,也希望可以帮到有需要的朋友。直接上代码。
/*** 根据父节点 id查询所有子节点id集合(包括自身id)** @param parentId 父节点id* @param clientId 客户端id* @return List<Long> 子节点id集合(包括自身id)*/@Overridepublic List<Long> getByParentId(Long parentId, Long clientId) {//查询出所有目录List<CatalogueInfo> catalogueInfos = lambdaQuery().eq(CatalogueInfo::getClientId, clientId).eq(CatalogueInfo::getUseFlag, "1").select(CatalogueInfo::getId, CatalogueInfo::getParentId).list();//根据目录的parentId, id把所有包含子目录的目录分组为mapImmutableListMultimap<Long, Long> catalogueInfoMap = catalogueInfos.stream().collect(ImmutableListMultimap.toImmutableListMultimap(CatalogueInfo::getParentId, CatalogueInfo::getId));//查询parentId下的所有子目录idList<Long> childIds = catalogueInfoMap.get(parentId);//最终返回的所有符合条件的目录idArrayList<Long> resultIds = new ArrayList<>(childIds);//将父id添加resultIds.add(parentId);//递归查询子节点的子节点reduce(childIds, catalogueInfoMap, resultIds);return resultIds;}
clientId:这个只是我查询所有目录业务中需要用到的参数,具体根据实际需求查出所有即可。
ImmutableListMultimap<Long, Long> catalogueInfoMap = catalogueInfos.stream().collect(ImmutableListMultimap.toImmutableListMultimap
(CatalogueInfo::getParentId, CatalogueInfo::getId));
这块代码主要是将所有目录分组,注意,只有当该目录下有子目录时候,会将该目录id作为key,子目录id作为value,这里的value是一个list集合。后面递归的时候,其实就是通过这个分组后的map,递归拿到子目录节点id,就是下方的List<Long> ids = catalogueInfoMap.get(id);
递归方法
/*** 递归查询所有子节点** @param childIds 待遍历id集合* @param catalogueInfoMap 分组map* @param resultIds 满足条件的id集合*/private void reduce(List<Long> childIds, ImmutableListMultimap<Long, Long> catalogueInfoMap, ArrayList<Long> resultIds) {//递归查询子节点的子节点,将所有的子节点添加到resultIdsfor (Long id : childIds) {List<Long> ids = catalogueInfoMap.get(id);if (ids.isEmpty()) {continue;}resultIds.addAll(ids);reduce(ids, catalogueInfoMap, resultIds);}}
Java递归查询子节点集合相关推荐
- oracle递归查询指定子节点,oracle递归查询子节点
通过子节点向根节点追朔. select * from persons.dept start with deptid=76 connect by prior paredeptid=deptid 通过根节 ...
- Java根据子节点获取最上层节点(根节点)数据和所有上级集合
目录 1 通过递归获取树形结构.通过父节点获取最底层节点(叶子节点)数据.树形XML,可以参考以下内容: 2 实体和数据结构 2.1 Dept实体类 2.2 相关树形结构 3 根据子节点获取最上层节点 ...
- java递归查询父节点_父节点递归查询和子节点递归查询函数
本文为博主原创,未经允许不得转载: 由于在项目中用到了向上查询父节点的递归查询和向下查询子节点查询的递归查询,由于在实现过程中,写递归查询的sql函数 花费了较长的时间,所以在此总结一下,两种递归查询 ...
- oracle递归查询子节点
通过子节点向根节点追朔. select * from persons.dept start with deptid=76 connect by prior paredeptid=deptid 通过根节 ...
- ztree 获取当前选中节点的子节点集合
功能:获取当前选中节点的子节点id集合. 步骤:1.获取当前节点 2.用ztree的方法transformToArray()获取当前选中节点(含选中节点)的子节点对象集合. 3.遍历集合,取出需要的值 ...
- java node子节点_[Java教程]Node节点
[Java教程]Node节点 0 2016-12-28 15:01:17 1.Node:节点 元素节点->HTML标签 文本节点->文字 但是在标准浏览器(除了IE6~8)中会把空格和换行 ...
- MySQL递归查询父节点或递归查询子节点-陈远波
根据id查询父节点,具体需要修改的地方笔者已在注释中给大家作了注解 DELIMITER $$USE `yjlc_platform`$$ -- getCompanyParent 为函数名 DROP FU ...
- Java递归查询某个节点下所有子节点多级信息(递归部门查询,递归树形结构数据查询)
前言 在做项目中我们会遇到树形结构数据,如果我们想要查询某个几点下面所有子节点(多级)数据,此时我们又不知道下面有多少级节点以及节点ID,那么我们就需要使用递归去查询了,当然在数据库中写函数也是可以实 ...
- java node子节点_使用Java的XPath循环遍历节点并提取特定的子节点值
我从谷歌了解到,使用XPath从XML中提取数据比使用DOM循环更有意义. 目前,我已经使用DOM实现了一个解决方案,但是代码很冗长,感觉不整洁且不可维护,所以我想切换到更清洁的XPath解决方案. ...
最新文章
- 百度飞桨成为北京市首个AI产业方向创新应用平台
- 保险业尚不能完全发挥CRM优势 需强化
- 做App还是微信公众号,你该如何抉择?
- centos7 安装 mysql5.7
- Linux下CMake简明教程(七)对库进行链接
- 量子纠缠在量子计算机中的作用,量子纠缠
- HDU 4722	Good Numbers 2013年四川省赛题
- pytorch 实现Gradient Flipping 各种坑
- 监控网页内容,发现需要的内容后弹框和声音提醒
- 超强学位论文检索工具,你必须拥有!
- 天线开路短路检测原理_LEA-5S的天线开路检测问题
- java PDF模板生成并导出(文字、表格、图片)
- taro 引用相对路径图片
- BeanFactory接口
- 活期理财每日计算利率
- SAP 不能打印的解决方法
- 机器人中的坐标转换关系(个人记录学习)
- com.alibaba.fastjson.JSONException: syntax error, expect {, actual [, pos 64, fieldName ***, fasjson
- 游戏开发:游戏内小红点的实现方案
- 一只小蜜蜂...(递推求解)
热门文章
- [转]Nginx 0.8.x + PHP 5.2.13(FastCGI)搭建胜过Apache十倍的Web服务器(第6版)
- 【OpenAirInterface】分立部署核心网与容器化ueransim仿真基站
- Harbor的安装及使用
- 阿弗雷德·阿德勒:《自卑与超越》第一章
- python爬豆瓣小组_Python伪装浏览器请求爬虫豆瓣小组
- 多项式求值的秦九韶算法
- Linux command | network
- python 估值模型_利用RFM模型建模,并通过聚类分析、分类,分别算出8中不同的价值会员...
- 骑行适合戴什么耳机,几款适合在骑行过程佩戴的耳机推荐
- 保时捷中国加速电气化布局: Taycan Cross Turismo 与 Taycan GTS 启动预售