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(ListtreeList,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{
ListmetaTypeList=tree.getChildList();
if(metaTypeList!=null&&metaTypeList.size()>0){
for(Treemeta:metaTypeList){
recursion(maps,meta);
}
}
}
returntree;
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。