欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java Tree結(jié)構(gòu)數(shù)據(jù)中查找匹配節(jié)點(diǎn)方式

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

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

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;
 }

補(bǔ)充知識(shí):java樹(shù)形結(jié)構(gòu)根據(jù)父級(jí)節(jié)點(diǎn)獲取其下面的所有最底層的根節(jié)點(diǎn)數(shù)據(jù)

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

一共兩個(gè)類

TreeNode 使用了lombok插件

TreeNodeTest

主要的邏輯都在TreeNodeTest中 如果有錯(cuò)誤的地方,還望留言評(píng)論,感謝

TreeNode

@Data
@AllArgsConstructor
public class TreeNode {

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

 /**
  * 父級(jí)ID
  **/
 private String parentId;

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

TreeNodeTest

/**
 * 測(cè)試類
 * 此方法建議數(shù)據(jù)量少的情況使用 或者 此數(shù)據(jù)很少變動(dòng)并且加入到緩存中
*/
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é)點(diǎn)路徑長(zhǎng)度必須一致的情況下才可以
   * 此Demo可以實(shí)現(xiàn) 根據(jù)0 獲取到[126 127 128 129 133 134 135 136]
   * 				根據(jù)123 獲取到[126 127 128 129]
   * 注:比如 126 127節(jié)點(diǎn)沒(méi)有 此時(shí)獲取到的0根節(jié)點(diǎn) 就會(huì)出現(xiàn) [124 128 129 133 134 135 136]
  */
  TreeNode treeNode = new TreeNode("123","0","北京");

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

  TreeNode treeNode3 = new TreeNode("126","124","豐臺(tái)區(qū)豐臺(tái)科技園");
  TreeNode treeNode4 = new TreeNode("127","124","豐臺(tái)區(qū)豐臺(tái)南路");
  TreeNode treeNode5 = new TreeNode("128","125","海淀區(qū)中關(guān)村");
  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ū)虹口足球場(chǎng)");
  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);

  // 按照父級(jí)ID分組
  Map<String,List<TreeNode>> groupByParentIdMap = treeNodes.stream()
    .collect(Collectors.groupingBy(TreeNode::getParentId));
  // 存放 0:對(duì)應(yīng)的所有根節(jié)點(diǎn)ID數(shù)據(jù)
  Set<String> topToLowerChildIdSet = new HashSet<>();
  // 取出頂級(jí)數(shù)據(jù)(也就是父級(jí)ID為0的數(shù)據(jù) 當(dāng)然頂層的父級(jí)ID也可以自定義 這里只是演示 所以給了0)
  List<TreeNode> topTreeNodes = groupByParentIdMap.get("0");

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

 /**
 * 根據(jù)父級(jí)節(jié)點(diǎn)獲取最低層次 那一級(jí)的節(jié)點(diǎn)數(shù)據(jù)
  *   1
  *  / \
  *  2  3
  *  / \ / \
  *  4 5 6 7
  * 上面的樹(shù)形結(jié)構(gòu)調(diào)用此方法 根據(jù)1 可以獲取到 [4 5 6 7]
  *      根據(jù)3 可以獲得到 [6 7]
  * @param groupByParentIdMap 所有的元素集合(根據(jù)父級(jí)ID進(jìn)行了分組) 分組方法可以使用lambda 如下:
  *       Map<String, List<Person>> peopleByCity = personStream.collect(Collectors.groupingBy(Person::getCity));
  * @param pid 父級(jí)ID
  * @param topToLowerChildIdSet 存儲(chǔ)最深根節(jié)點(diǎn)的數(shù)據(jù)集合
 */
 public static Set<String> getMinimumChildIdArray(Map<String,List<TreeNode>> groupByParentIdMap,
              String pid, Set<String> topToLowerChildIdSet){
  // 存放當(dāng)前pid對(duì)應(yīng)的所有根節(jié)點(diǎn)ID數(shù)據(jù)
  Set<String> currentPidLowerChildIdSet = new HashSet<>();
  // 獲取當(dāng)前pid下所有的子節(jié)點(diǎn)
  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 表示當(dāng)前遍歷的treeNode節(jié)點(diǎn)為最底層的節(jié)點(diǎn)
    currentPidLowerChildIdSet.add(treeNode.getId());
   }
  }
  System.out.println("當(dāng)前父級(jí)ID:"+ pid + "下所有的根節(jié)點(diǎn)數(shù)據(jù):" + currentPidLowerChildIdSet.toString());
  // 把當(dāng)前獲取到的根節(jié)點(diǎn)數(shù)據(jù) 一并保存到上一個(gè)節(jié)點(diǎn)父級(jí)ID集合中
  topToLowerChildIdSet.addAll(currentPidLowerChildIdSet);
  return currentPidLowerChildIdSet;
 }
}

運(yùn)行后的結(jié)果:

以上這篇Java Tree結(jié)構(gòu)數(shù)據(jù)中查找匹配節(jié)點(diǎn)方式就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • @RequestBody不能映射到對(duì)象的解決

    @RequestBody不能映射到對(duì)象的解決

    這篇文章主要介紹了@RequestBody不能映射到對(duì)象的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Java向上向下轉(zhuǎn)型詳解

    Java向上向下轉(zhuǎn)型詳解

    這篇文章主要為大家詳細(xì)介紹了Java向上向下轉(zhuǎn)型,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-09-09
  • Java?Redisson多策略注解限流

    Java?Redisson多策略注解限流

    這篇文章主要介紹了Java?Redisson多策略注解限流,文章使用Redisson的RRateLimiter進(jìn)行限流,詳細(xì)介紹,感興趣的小伙伴可以參考下面文章內(nèi)容
    2022-09-09
  • java?webservice超時(shí)時(shí)間設(shè)置方法代碼

    java?webservice超時(shí)時(shí)間設(shè)置方法代碼

    當(dāng)我們使用WebService進(jìn)行調(diào)用時(shí),有時(shí)會(huì)出現(xiàn)超時(shí)的情況,下面這篇文章主要給大家介紹了關(guān)于java?webservice超時(shí)時(shí)間設(shè)置方法的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-01-01
  • Java8的EnumMap源碼分析

    Java8的EnumMap源碼分析

    這篇文章主要介紹了Java8的EnumMap源碼分析,EnumMap 是一個(gè)用于存儲(chǔ) key 為枚舉類型的 map,底層使用數(shù)組實(shí)現(xiàn)(K,V 雙數(shù)組),與其他類型 map 不同的是 EnumMap 底層使用雙數(shù)組來(lái)存儲(chǔ) key 與 value,key 數(shù)組會(huì)在構(gòu)造函數(shù)中根據(jù) keyType 進(jìn)行初始化,需要的朋友可以參考下
    2023-11-11
  • Java常用類之比較器的使用詳解

    Java常用類之比較器的使用詳解

    這篇文章主要為大家詳細(xì)介紹了Java中比較器的相關(guān)資料,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2022-11-11
  • IntelliJ Idea常用11款插件(提高開(kāi)發(fā)效率)

    IntelliJ Idea常用11款插件(提高開(kāi)發(fā)效率)

    這篇文章主要介紹了IntelliJ Idea常用11款插件(提高開(kāi)發(fā)效率),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • spring?cloud?eureka?服務(wù)啟動(dòng)失敗的原因分析及解決方法

    spring?cloud?eureka?服務(wù)啟動(dòng)失敗的原因分析及解決方法

    這篇文章主要介紹了spring?cloud?eureka?服務(wù)啟動(dòng)失敗的原因解析,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-03-03
  • Hikari?數(shù)據(jù)庫(kù)連接池內(nèi)部源碼實(shí)現(xiàn)的小細(xì)節(jié)

    Hikari?數(shù)據(jù)庫(kù)連接池內(nèi)部源碼實(shí)現(xiàn)的小細(xì)節(jié)

    這篇文章主要介紹了Hikari?數(shù)據(jù)庫(kù)連接池內(nèi)部源碼實(shí)現(xiàn)的小細(xì)節(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • 詳解SpringBoot之集成Spring AOP

    詳解SpringBoot之集成Spring AOP

    本篇文章主要介紹了詳解SpringBoot之集成Spring AOP,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-07-07

最新評(píng)論