Java Tree结构数据中查找匹配节点方式
我就废话不多说了,大家还是直接看代码吧~
privatebooleancontains(Listchildren,Stringvalue){ for(TreeVochild:children){ if(child.getName().equals(value)||(child.getChildren().size()>0&&contains(child.getChildren(),value))){ returntrue; } } returnfalse; }
补充知识:java树形结构根据父级节点获取其下面的所有最底层的根节点数据
因工作中需要根据任意父级节点查找到树形节点下的根节点信息,所以写了下面一个demo方便自己需要时的查看以及需要的人参考
一共两个类
TreeNode使用了lombok插件
TreeNodeTest
主要的逻辑都在TreeNodeTest中如果有错误的地方,还望留言评论,感谢
TreeNode
@Data @AllArgsConstructor publicclassTreeNode{ /** *节点ID **/ privateStringid; /** *父级ID **/ privateStringparentId; /** *节点名称 **/ privateStringname; }
TreeNodeTest
/** *测试类 *此方法建议数据量少的情况使用或者此数据很少变动并且加入到缓存中 */ publicclassTreeNodeTest{ publicstaticvoidmain(String[]args){ /** *0 */\ *123130 */\/\ *124125131132 */\/\/\/\ *126127128129133134135136 *只支持节点路径长度必须一致的情况下才可以 *此Demo可以实现根据0获取到[126127128129133134135136] * 根据123获取到[126127128129] *注:比如126127节点没有此时获取到的0根节点就会出现[124128129133134135136] */ TreeNodetreeNode=newTreeNode("123","0","北京"); TreeNodetreeNode1=newTreeNode("124","123","丰台区"); TreeNodetreeNode2=newTreeNode("125","123","海淀区"); TreeNodetreeNode3=newTreeNode("126","124","丰台区丰台科技园"); TreeNodetreeNode4=newTreeNode("127","124","丰台区丰台南路"); TreeNodetreeNode5=newTreeNode("128","125","海淀区中关村"); TreeNodetreeNode6=newTreeNode("129","125","海淀区海淀公园"); TreeNodetreeNode7=newTreeNode("130","0","上海"); TreeNodetreeNode8=newTreeNode("131","130","徐汇区"); TreeNodetreeNode9=newTreeNode("132","130","虹口区"); TreeNodetreeNode10=newTreeNode("133","131","徐汇区龙华寺"); TreeNodetreeNode11=newTreeNode("134","131","徐汇区天主教堂"); TreeNodetreeNode12=newTreeNode("135","132","虹口区虹口足球场"); TreeNodetreeNode13=newTreeNode("136","132","虹口区鲁迅公园"); ListtreeNodes=newLinkedList<>(); treeNodes.add(treeNode); treeNodes.add(treeNode1); treeNodes.add(treeNode2); treeNodes.add(treeNode3); treeNodes.add(treeNode4); treeNodes.add(treeNode5); treeNodes.add(treeNode6); treeNodes.add(treeNode7); treeNodes.add(treeNode8); treeNodes.add(treeNode9); treeNodes.add(treeNode10); treeNodes.add(treeNode11); treeNodes.add(treeNode12); treeNodes.add(treeNode13); //按照父级ID分组 Map >groupByParentIdMap=treeNodes.stream() .collect(Collectors.groupingBy(TreeNode::getParentId)); //存放0:对应的所有根节点ID数据 Set topToLowerChildIdSet=newHashSet<>(); //取出顶级数据(也就是父级ID为0的数据当然顶层的父级ID也可以自定义这里只是演示所以给了0) List topTreeNodes=groupByParentIdMap.get("0"); for(TreeNodenode:topTreeNodes){ getMinimumChildIdArray(groupByParentIdMap,node.getId(),topToLowerChildIdSet); } System.out.println("0节点下所有的根节点数据集合:"+topToLowerChildIdSet.toString()); } /** *根据父级节点获取最低层次那一级的节点数据 *1 */\ *23 */\/\ *4567 *上面的树形结构调用此方法根据1可以获取到[4567] *根据3可以获得到[67] *@paramgroupByParentIdMap所有的元素集合(根据父级ID进行了分组)分组方法可以使用lambda如下: *Map >peopleByCity=personStream.collect(Collectors.groupingBy(Person::getCity)); *@parampid父级ID *@paramtopToLowerChildIdSet存储最深根节点的数据集合 */ publicstaticSet getMinimumChildIdArray(Map >groupByParentIdMap, Stringpid,Set topToLowerChildIdSet){ //存放当前pid对应的所有根节点ID数据 Set currentPidLowerChildIdSet=newHashSet<>(); //获取当前pid下所有的子节点 List childTreeNodes=groupByParentIdMap.get(pid); if(CollUtil.isEmpty(childTreeNodes)){ returnnull; } for(TreeNodetreeNode:childTreeNodes){ Set lowerChildIdSet=getMinimumChildIdArray(groupByParentIdMap,treeNode.getId(),currentPidLowerChildIdSet); if(CollUtil.isEmpty(lowerChildIdSet)){ //如果返回null表示当前遍历的treeNode节点为最底层的节点 currentPidLowerChildIdSet.add(treeNode.getId()); } } System.out.println("当前父级ID:"+pid+"下所有的根节点数据:"+currentPidLowerChildIdSet.toString()); //把当前获取到的根节点数据一并保存到上一个节点父级ID集合中 topToLowerChildIdSet.addAll(currentPidLowerChildIdSet); returncurrentPidLowerChildIdSet; } }
运行后的结果:
以上这篇JavaTree结构数据中查找匹配节点方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。