最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java Tree結構數據中查找匹配節(jié)點方式

 更新時間:2020年09月10日 11:38:57   作者:我叫農  
這篇文章主要介紹了Java Tree結構數據中查找匹配節(jié)點方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

我就廢話不多說了,大家還是直接看代碼吧~

private boolean contains(List<TreeVo> 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樹形結構根據父級節(jié)點獲取其下面的所有最底層的根節(jié)點數據

因工作中需要根據任意父級節(jié)點查找到樹形節(jié)點下的根節(jié)點信息,所以寫了下面一個demo方便自己需要時的查看以及需要的人參考

一共兩個類

TreeNode 使用了lombok插件

TreeNodeTest

主要的邏輯都在TreeNodeTest中 如果有錯誤的地方,還望留言評論,感謝

TreeNode

@Data
@AllArgsConstructor
public class TreeNode {

 /**
  * 節(jié)點ID
  **/
 private String id;

 /**
  * 父級ID
  **/
 private String parentId;

 /**
  * 節(jié)點名稱
  **/
 private String name;
}

TreeNodeTest

/**
 * 測試類
 * 此方法建議數據量少的情況使用 或者 此數據很少變動并且加入到緩存中
*/
public class TreeNodeTest {

 public static void main(String[] args) {
  /**
   *        0
   *       /   \
   *      123   130
   *      / \  /  \
   *     124 125  131  132
   *     / \ / \  / \ / \
   *     126 127 128 129 133 134 135 136
   * 只支持 節(jié)點路徑長度必須一致的情況下才可以
   * 此Demo可以實現 根據0 獲取到[126 127 128 129 133 134 135 136]
   * 				根據123 獲取到[126 127 128 129]
   * 注:比如 126 127節(jié)點沒有 此時獲取到的0根節(jié)點 就會出現 [124 128 129 133 134 135 136]
  */
  TreeNode treeNode = new TreeNode("123","0","北京");

  TreeNode treeNode1 = new TreeNode("124","123","豐臺區(qū)");
  TreeNode treeNode2 = new TreeNode("125","123","海淀區(qū)");

  TreeNode treeNode3 = new TreeNode("126","124","豐臺區(qū)豐臺科技園");
  TreeNode treeNode4 = new TreeNode("127","124","豐臺區(qū)豐臺南路");
  TreeNode treeNode5 = new TreeNode("128","125","海淀區(qū)中關村");
  TreeNode treeNode6 = new TreeNode("129","125","海淀區(qū)海淀公園");

  TreeNode treeNode7 = new TreeNode("130","0","上海");
  TreeNode treeNode8 = new TreeNode("131","130","徐匯區(qū)");
  TreeNode treeNode9 = new TreeNode("132","130","虹口區(qū)");

  TreeNode treeNode10 = new TreeNode("133","131","徐匯區(qū)龍華寺");
  TreeNode treeNode11 = new TreeNode("134","131","徐匯區(qū)天主教堂");
  TreeNode treeNode12 = new TreeNode("135","132","虹口區(qū)虹口足球場");
  TreeNode treeNode13 = new TreeNode("136","132","虹口區(qū)魯迅公園");


  List<TreeNode> 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<String,List<TreeNode>> groupByParentIdMap = treeNodes.stream()
    .collect(Collectors.groupingBy(TreeNode::getParentId));
  // 存放 0:對應的所有根節(jié)點ID數據
  Set<String> topToLowerChildIdSet = new HashSet<>();
  // 取出頂級數據(也就是父級ID為0的數據 當然頂層的父級ID也可以自定義 這里只是演示 所以給了0)
  List<TreeNode> topTreeNodes = groupByParentIdMap.get("0");

  for(TreeNode node : topTreeNodes){
   getMinimumChildIdArray(groupByParentIdMap,node.getId(),topToLowerChildIdSet);
  }
  System.out.println("0節(jié)點下所有的根節(jié)點數據集合:" + topToLowerChildIdSet.toString());
 }

 /**
 * 根據父級節(jié)點獲取最低層次 那一級的節(jié)點數據
  *   1
  *  / \
  *  2  3
  *  / \ / \
  *  4 5 6 7
  * 上面的樹形結構調用此方法 根據1 可以獲取到 [4 5 6 7]
  *      根據3 可以獲得到 [6 7]
  * @param groupByParentIdMap 所有的元素集合(根據父級ID進行了分組) 分組方法可以使用lambda 如下:
  *       Map<String, List<Person>> peopleByCity = personStream.collect(Collectors.groupingBy(Person::getCity));
  * @param pid 父級ID
  * @param topToLowerChildIdSet 存儲最深根節(jié)點的數據集合
 */
 public static Set<String> getMinimumChildIdArray(Map<String,List<TreeNode>> groupByParentIdMap,
              String pid, Set<String> topToLowerChildIdSet){
  // 存放當前pid對應的所有根節(jié)點ID數據
  Set<String> currentPidLowerChildIdSet = new HashSet<>();
  // 獲取當前pid下所有的子節(jié)點
  List<TreeNode> childTreeNodes = groupByParentIdMap.get(pid);
  if(CollUtil.isEmpty(childTreeNodes)){
   return null;
  }
  for(TreeNode treeNode : childTreeNodes){
   Set<String> lowerChildIdSet = getMinimumChildIdArray(groupByParentIdMap,treeNode.getId(),currentPidLowerChildIdSet);
   if(CollUtil.isEmpty(lowerChildIdSet)){
    // 如果返回null 表示當前遍歷的treeNode節(jié)點為最底層的節(jié)點
    currentPidLowerChildIdSet.add(treeNode.getId());
   }
  }
  System.out.println("當前父級ID:"+ pid + "下所有的根節(jié)點數據:" + currentPidLowerChildIdSet.toString());
  // 把當前獲取到的根節(jié)點數據 一并保存到上一個節(jié)點父級ID集合中
  topToLowerChildIdSet.addAll(currentPidLowerChildIdSet);
  return currentPidLowerChildIdSet;
 }
}

運行后的結果:

以上這篇Java Tree結構數據中查找匹配節(jié)點方式就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • MybatisPlus實現分頁查詢和動態(tài)SQL查詢的示例代碼

    MybatisPlus實現分頁查詢和動態(tài)SQL查詢的示例代碼

    本文主要介紹了MybatisPlus實現分頁查詢和動態(tài)SQL查詢的示例代碼,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • mybatis 如何通過resultMap 返回long

    mybatis 如何通過resultMap 返回long

    這篇文章主要介紹了mybatis 如何通過resultMap 返回long的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java?Bean?Validation使用示例詳解

    Java?Bean?Validation使用示例詳解

    這篇文章主要為大家介紹了Java?Bean?Validation的使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11
  • Java BeanUtils.copyProperties的詳解

    Java BeanUtils.copyProperties的詳解

    這篇文章主要介紹了Java BeanUtils.copyProperties的詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-08-08
  • Java調用微信客服消息實現發(fā)貨通知的方法詳解

    Java調用微信客服消息實現發(fā)貨通知的方法詳解

    這篇文章主要介紹了Java調用微信客服消息實現發(fā)貨通知的方法,結合實例形式詳細分析了java針對微信接口調用的原理、調用方法與相關注意事項,需要的朋友可以參考下
    2017-08-08
  • Java多線程實例

    Java多線程實例

    本文給大家介紹java多線程實例,對java多線程知識感興趣的朋友參考下吧
    2015-11-11
  • Java類的初始化順序的實現

    Java類的初始化順序的實現

    類的初始化過程是在類加載階段完成的,包括加載、驗證、準備、解析和初始化等步驟,本文主要介紹了Java類的初始化順序的實現,感興趣的可以了解一下
    2023-12-12
  • Windows下RabbitMQ安裝及配置詳解

    Windows下RabbitMQ安裝及配置詳解

    本文主要介紹了Windows下RabbitMQ安裝及配置詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-07-07
  • 輕松掌握java責任鏈模式

    輕松掌握java責任鏈模式

    這篇文章主要幫助大家輕松掌握java責任鏈模式,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • 詳解SpringBoot同時可以處理多少請求

    詳解SpringBoot同時可以處理多少請求

    在日常操作中,相信很多人在SpringBoot能同時處理多少請求問題上存在疑惑,本文就來詳細的介紹一下,感興趣的可以了解一下
    2024-06-06

最新評論

深水埗区| 关岭| 和平县| 柯坪县| 双牌县| 栾城县| 库伦旗| 朝阳区| 昌江| 陇南市| 达日县| 任丘市| 长汀县| 方山县| 凌云县| 汝州市| 宁夏| 普格县| 冕宁县| 藁城市| 常州市| 虞城县| 元氏县| 特克斯县| 湄潭县| 大石桥市| 温州市| 武宁县| 新丰县| 阿荣旗| 芒康县| 唐河县| 罗定市| 浦县| 织金县| 新沂市| 昌平区| 长宁县| 安远县| 东辽县| 柳江县|