工作中因业务需求,将数据库中的树状结构的数据根据父节点获取所有的子节点

实现思路

1.获取整个数据的list集合数据

2.将数据分组,java8 list有groupby分组,java8之前的自己遍历整理

3.分组后递归获取子节点,有子节点的添加,没有的设置子节点并删除分组的数据,知道分组数据删完

Tree.java

@Data
public class Tree {
private Integer id;
private Integer pId;
private String key;
private String value;
private List<Tree> childList;
}

TreeUtils.java

public class TreeUtils {
static List<Tree> trees ;
static {
String jsonStr = "[" +
"{\"id\":100,\"pId\":1,\"key\":\"root\", \"value\": \"root\"}," +
"{\"id\":1000,\"pId\":100,\"key\":\"node1\", \"value\": \"node1\"}," +
"{\"id\":2000,\"pId\":100,\"key\":\"node2\",\"value\": \"node2\"}," +
"{\"id\":3000,\"pId\":100,\"key\":\"node3\",\"value\": \"node3\"}," +
"{\"id\":1100,\"pId\":1000,\"key\":\"node11\",\"value\": \"node11\"}," +
"{\"id\":1200,\"pId\":1000,\"key\":\"node12\",\"value\": \"node12\"}," +
"{\"id\":1110,\"pId\":1100,\"key\":\"node111\",\"value\": \"node111\"}," +
"{\"id\":1120,\"pId\":1100,\"key\":\"node112\",\"value\": \"node112\"}," +
"{\"id\":2100,\"pId\":2000,\"key\":\"node21\",\"value\": \"node21\"}," +
"{\"id\":2200,\"pId\":2000,\"key\":\"node22\",\"value\": \"node22\"}," +
"{\"id\":2110,\"pId\":2100,\"key\":\"node211\",\"value\": \"node21\"}" +
"]";
trees = JSONObject.parseArray(jsonStr, Tree.class);
} public static void main(String[] args) {
Tree tree = metaTree(trees, 100);
/**
* Tree@6073f712[id=100,pId=1,key=root,value=root,childList=[
* Tree(id=1000, pId=100, key=node1, value=node1, childList=[
* Tree(id=1100, pId=1000, key=node11, value=node11, childList=[
* Tree(id=1110, pId=1100, key=node111, value=node111, childList=null),
* Tree(id=1120, pId=1100, key=node112, value=node112, childList=null)]),
* Tree(id=1200, pId=1000, key=node12, value=node12, childList=null)]),
* Tree(id=2000, pId=100, key=node2, value=node2, childList=[
* Tree(id=2100, pId=2000, key=node21, value=node21, childList=[
* Tree(id=2110, pId=2100, key=node211, value=node21, childList=null)]),
* Tree(id=2200, pId=2000, key=node22, value=node22, childList=null)]),
* Tree(id=3000, pId=100, key=node3, value=node3, childList=null)]]
*/
System.out.println("tree:" + ToStringBuilder.reflectionToString(tree));
} private static Tree metaTree(List<Tree> treeList, Integer id) {
//此处getId getPId根据自己实际情况更改
Tree treeConfig = treeList.stream().filter(tree -> tree.getId().equals(id)).collect(Collectors.toList()).get(0);
Map<Integer, List<Tree>> collect = treeList.stream().filter(type -> type.getPId() != null).collect(Collectors.groupingBy(Tree::getPId));
if (collect != null && collect.size() > 0) {
recursion(collect, treeConfig);
}
return treeConfig;
} private static Tree recursion(Map<Integer, List<Tree>> maps, Tree tree) {
if (tree.getChildList() == null) {
if (maps.get(tree.getId()) != null) {
tree.setChildList(maps.get(tree.getId()));
maps.remove(tree.getId());
if (maps.size() > 0) {
recursion(maps, tree);
}
}
} else {
List<Tree> metaTypeList = tree.getChildList();
if (metaTypeList != null && metaTypeList.size() > 0) {
for (Tree meta : metaTypeList) {
recursion(maps, meta);
}
}
}
return tree;
}
}

@Data使用的lombok插件,自动生成get set方法

欢迎加群513650703一起交流

java list根据id获取子节点的更多相关文章

  1. 遍历DOM树,获取子节点

    获取子节点的方法有:  方法  说明  children()  选取子节点,可以带过滤参数.但只能选择子节点,不能选择孙子节点.  find()  选取子节点,可以带过滤参数.可以选择子节点及孙子节点 ...

  2. 用JS和JQ来获取子节点!

    用JS和JQ来获取子节点!   在JS中,如果通过document.getElementsByTagName来获取子元素有个弊端:它不单会获取符合要求的子元素,就连同孙元素也会获取.如果有特殊要求,那 ...

  3. JSDOM获取子节点的一些方法

    一般情况获取子节点,通过找到查找父节点的ID或者class类名,来获取父节点,再通过children属性,得到子节点的数组: 之前在另外一篇随笔中说过,如果使用另一个属性childNode,会把注释. ...

  4. JS获取子节点、父节点和兄弟节点的方法实例总结

    转自:https://www.jb51.net/article/143286.htm 本文实例讲述了JS获取子节点.父节点和兄弟节点的方法.分享给大家供大家参考,具体如下: 一.js获取子节点的方式 ...

  5. ztree 获取子节点所有父节点的name的拼接

    ztree 获取子节点所有父节点的name的拼接 //获取子节点,所有父节点的name的拼接字符串function getFilePath(treeObj){if(treeObj==null)retu ...

  6. js获取子节点和修改input的文本框内容

    js获取子节点和修改input的文本框内容 js获取子节点: $("#"+defaultPVItemId).children().eq(3); //获取某个选择器下的第四个子节点 ...

  7. 问题:jQuery中遍历XML文件时候,获取子节点children不支持的情况(已解决)

    问题描述: 今天在写一个基于 jquery 的读取xml文件的程序时候,需要遍历xml的节点. 代码片段如下: function parse_xml_node(parent,result){ // r ...

  8. JS之获取子节点

    在JS中获取子节点有以下几种方法: firstElementChild.firstChild.childNodes和children 我们通过一个例子来分析这几种方法的区别(获取div下的p标签) 输 ...

  9. ELementUI 树形控件tree 获取子节点同时获取半选择状态的父节点ID

    使用element-ui  tree树形控件的时候,在选择一个子节点后,使用getCheckedKeys 后,发现只能返回子节点的ID,但是其父节点ID没有返回. 解决办法有三种: 1.element ...

随机推荐

  1. PHP+JQUERY+AJAX上传、裁剪图片

    PHP部分 /*图片上传*/ public function upload1(){ $file = $_FILES['file']; $upload = new \Think\Upload();// ...

  2. rabbitmq关于guest用户登录失败解决方法

    刚安装完rabbitmq,登录的时候出现了: login  failed问题: 查看rabbitmq的文档,发现在3.3.1以后的版中,处于安全的考虑,guest这个默认的用户只能通过localhos ...

  3. disconf实践(一)Ubuntu16.04部署disconf

    在企业中,随着公司业务的扩张,用户量的增大,单一节点应用无法支撑正常的业务逻辑,比较常见的现象是访问速度变慢,甚至超时,严重时可能会造成系统宕机.为了尽量减少宕机的风险,单一节点系统需要进行水平扩展, ...

  4. 验证码帮助类【CaptchaHelper 】

    GDI+:Graphics Device Interface Plus也就是图形设备接口,提供了各种丰富的图形图像处理功能;在C#.NET中,使用GDI+处理二维(2D)的图形和图像,使用Direct ...

  5. Linux下Java性能监控

    Linux下Java性能监控 一.JVM堆内存使用监控 获取thread dump的3种方法: 1)使用$JAVA_HOME/bin/jcosole中的MBean,到MBean>com.sun. ...

  6. Gradle Goodness: Parse Files with SimpleTemplateEngine in Copy Task

    With the copy task of Gradle we can copy files that are parsed by Groovy's SimpleTemplateEngine. Thi ...

  7. jquery toggleclass方法

    给元素更改样式,一般使用 addClass() 和removeClass() jquery官方文档 对 addClass的介绍: Adds the specified class(es) to eac ...

  8. Solr 同义词搜索

    1.  进入solr配置目录 cd /usr/local/solr/solrhome/collection1/conf vi schema.xml 增加配置节 <fieldType name=& ...

  9. 从零开始搭建vue移动端项目到上线的步骤

    初始化项目 1.在安装了node.js的前提下,使用以下命令 npm install --g vue-cli 2.在将要构建项目的目录下 vue init webpack myproject(项目目录 ...

  10. axios的post请求后台(ThinkPHP5)接收不到数据

    最近做vue项目,做分页的功能,使用post给后台发送数据,使用接口还是工具(postman)都可获取数据,唯独axios获取不到:经过排除,发现这与axios的post传参格式有关系: this.$ ...