栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java Tree结构数据中查找匹配节点方式

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java Tree结构数据中查找匹配节点方式

我就废话不多说了,大家还是直接看代码吧~

private boolean contains(List children, String value) {
  for (TreeVo child : children) {
   if (child.getName().equals(value) || (child.getChildren().size() > 0 && contains(child.getChildren(), value))) {
    return true;
   }
  }
  return false;
 }

补充知识:java树形结构根据父级节点获取其下面的所有最底层的根节点数据

因工作中需要根据任意父级节点查找到树形节点下的根节点信息,所以写了下面一个demo方便自己需要时的查看以及需要的人参考

一共两个类

TreeNode 使用了lombok插件

TreeNodeTest

主要的逻辑都在TreeNodeTest中 如果有错误的地方,还望留言评论,感谢

TreeNode

@Data
@AllArgsConstructor
public class TreeNode {

 
 private String id;

 
 private String parentId;

 
 private String name;
}

TreeNodeTest


public class TreeNodeTest {

 public static void main(String[] args) {
     
   *      123   130
   *      /   /  
   *     124 125  131  132
   *     /  /   /  / 
   *     126 127 128 129 133 134 135 136
   * 只支持 节点路径长度必须一致的情况下才可以
   * 此Demo可以实现 根据0 获取到[126 127 128 129 133 134 135 136]
   * 				根据123 获取到[126 127 128 129]
   * 注:比如 126 127节点没有 此时获取到的0根节点 就会出现 [124 128 129 133 134 135 136]
  */
  TreeNode treeNode = new TreeNode("123","0","北京");

  TreeNode treeNode1 = new TreeNode("124","123","丰台区");
  TreeNode treeNode2 = new TreeNode("125","123","海淀区");

  TreeNode treeNode3 = new TreeNode("126","124","丰台区丰台科技园");
  TreeNode treeNode4 = new TreeNode("127","124","丰台区丰台南路");
  TreeNode treeNode5 = new TreeNode("128","125","海淀区中关村");
  TreeNode treeNode6 = new TreeNode("129","125","海淀区海淀公园");

  TreeNode treeNode7 = new TreeNode("130","0","上海");
  TreeNode treeNode8 = new TreeNode("131","130","徐汇区");
  TreeNode treeNode9 = new TreeNode("132","130","虹口区");

  TreeNode treeNode10 = new TreeNode("133","131","徐汇区龙华寺");
  TreeNode treeNode11 = new TreeNode("134","131","徐汇区天主教堂");
  TreeNode treeNode12 = new TreeNode("135","132","虹口区虹口足球场");
  TreeNode treeNode13 = new TreeNode("136","132","虹口区鲁迅公园");


  List treeNodes = new linkedList<>();
  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 = new HashSet<>();
  // 取出顶级数据(也就是父级ID为0的数据 当然顶层的父级ID也可以自定义 这里只是演示 所以给了0)
  List topTreeNodes = groupByParentIdMap.get("0");

  for(TreeNode node : topTreeNodes){
   getMinimumChildIdArray(groupByParentIdMap,node.getId(),topToLowerChildIdSet);
  }
  System.out.println("0节点下所有的根节点数据集合:" + topToLowerChildIdSet.toString());
 }

 
 public static Set getMinimumChildIdArray(Map> groupByParentIdMap,
String pid, Set topToLowerChildIdSet){
  // 存放当前pid对应的所有根节点ID数据
  Set currentPidLowerChildIdSet = new HashSet<>();
  // 获取当前pid下所有的子节点
  List childTreeNodes = groupByParentIdMap.get(pid);
  if(CollUtil.isEmpty(childTreeNodes)){
   return null;
  }
  for(TreeNode treeNode : 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);
  return currentPidLowerChildIdSet;
 }
}

运行后的结果:

以上这篇Java Tree结构数据中查找匹配节点方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持考高分网。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/131885.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号