Java list如何根据id获取子节点
工作中因业务需求,将数据库中的树状结构的数据根据父节点获取所有的子节点
实现思路
1.获取整个数据的list集合数据
2.将数据分组,java8list有groupby分组,java8之前的自己遍历整理
3.分组后递归获取子节点,有子节点的添加,没有的设置子节点并删除分组的数据,知道分组数据删完
Tree.java
@Data publicclassTree{ privateIntegerid; privateIntegerpId; privateStringkey; privateStringvalue; privateListchildList; }
TreeUtils.java
publicclassTreeUtils{ staticListtrees; static{ StringjsonStr="["+ "{\"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); } publicstaticvoidmain(String[]args){ Treetree=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)); } privatestaticTreemetaTree(List treeList,Integerid){ //此处getIdgetPId根据自己实际情况更改 TreetreeConfig=treeList.stream().filter(tree->tree.getId().equals(id)).collect(Collectors.toList()).get(0); Map >collect=treeList.stream().filter(type->type.getPId()!=null).collect(Collectors.groupingBy(Tree::getPId)); if(collect!=null&&collect.size()>0){ recursion(collect,treeConfig); } returntreeConfig; } privatestaticTreerecursion(Map >maps,Treetree){ 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 metaTypeList=tree.getChildList(); if(metaTypeList!=null&&metaTypeList.size()>0){ for(Treemeta:metaTypeList){ recursion(maps,meta); } } } returntree; } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。