亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術(shù)文章
文章詳情頁

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

瀏覽:6日期:2022-08-25 09:47:15

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

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é)構(gòu)根據(jù)父級節(jié)點獲取其下面的所有最底層的根節(jié)點數(shù)據(jù)

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

一共兩個類

TreeNode 使用了lombok插件

TreeNodeTest

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

TreeNode

@Data@AllArgsConstructorpublic class TreeNode { /** * 節(jié)點ID **/ private String id; /** * 父級ID **/ private String parentId; /** * 節(jié)點名稱 **/ private String name;}

TreeNodeTest

/** * 測試類 * 此方法建議數(shù)據(jù)量少的情況使用 或者 此數(shù)據(jù)很少變動并且加入到緩存中*/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可以實現(xiàn) 根據(jù)0 獲取到[126 127 128 129 133 134 135 136] * 根據(jù)123 獲取到[126 127 128 129] * 注:比如 126 127節(jié)點沒有 此時獲取到的0根節(jié)點 就會出現(xiàn) [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ū)中關(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ū)虹口足球場'); 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:對應(yīng)的所有根節(jié)點ID數(shù)據(jù) Set<String> topToLowerChildIdSet = new HashSet<>(); // 取出頂級數(shù)據(jù)(也就是父級ID為0的數(shù)據(jù) 當(dāng)然頂層的父級ID也可以自定義 這里只是演示 所以給了0) List<TreeNode> topTreeNodes = groupByParentIdMap.get('0'); for(TreeNode node : topTreeNodes){ getMinimumChildIdArray(groupByParentIdMap,node.getId(),topToLowerChildIdSet); } System.out.println('0節(jié)點下所有的根節(jié)點數(shù)據(jù)集合:' + topToLowerChildIdSet.toString()); } /** * 根據(jù)父級節(jié)點獲取最低層次 那一級的節(jié)點數(shù)據(jù) * 1 * / * 2 3 * / / * 4 5 6 7 * 上面的樹形結(jié)構(gòu)調(diào)用此方法 根據(jù)1 可以獲取到 [4 5 6 7] * 根據(jù)3 可以獲得到 [6 7] * @param groupByParentIdMap 所有的元素集合(根據(jù)父級ID進行了分組) 分組方法可以使用lambda 如下: * Map<String, List<Person>> peopleByCity = personStream.collect(Collectors.groupingBy(Person::getCity)); * @param pid 父級ID * @param topToLowerChildIdSet 存儲最深根節(jié)點的數(shù)據(jù)集合 */ public static Set<String> getMinimumChildIdArray(Map<String,List<TreeNode>> groupByParentIdMap, String pid, Set<String> topToLowerChildIdSet){ // 存放當(dāng)前pid對應(yīng)的所有根節(jié)點ID數(shù)據(jù) Set<String> currentPidLowerChildIdSet = new HashSet<>(); // 獲取當(dāng)前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 表示當(dāng)前遍歷的treeNode節(jié)點為最底層的節(jié)點 currentPidLowerChildIdSet.add(treeNode.getId()); } } System.out.println('當(dāng)前父級ID:'+ pid + '下所有的根節(jié)點數(shù)據(jù):' + currentPidLowerChildIdSet.toString()); // 把當(dāng)前獲取到的根節(jié)點數(shù)據(jù) 一并保存到上一個節(jié)點父級ID集合中 topToLowerChildIdSet.addAll(currentPidLowerChildIdSet); return currentPidLowerChildIdSet; }}

運行后的結(jié)果:

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

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

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 亚洲国产第一区二区三区 | 久久久久久久国产精品 | 亚洲欧洲国产日产 | 免费看一级毛片 | 免费视频一区二区性色 | 国产a级三级三级三级 | 久久精品国产99久久 | 国产成人精品一区二区 | 五月伊人网 | 经典三级影院 | 天天影视色香欲综合网老头 | 国产午夜亚洲精品一区网站 | 高清欧美一区二区免费影视 | 日本黄大片免播放视播放器 | 欧美日韩精品国产一区在线 | 日本一级毛片大片免费 | 国产l精品国产亚洲区在线观看 | 你操综合 | 久久大香萑太香蕉综合网 | 免费区欧美一级毛片 | 一级二级毛片 | 一区二区三区视频免费 | 欧美综合视频在线观看 | 亚洲激情婷婷 | 日本高清免费不卡毛片 | 7m凹凸国产刺激在线视频 | 亚洲视频免费在线 | 男女一级毛片免费视频看 | 在线观看麻豆视频 | 成人特黄午夜性a一级毛片 成人爱av18丰满 | 在线精品自拍 | 国产黄色免费观看 | 一级毛片免费全部播放完整 | 成人男女网18免费软件大全 | 91官网 | 伊人网影院 | 一级美国乱色毛片 | 亚洲图片一区二区 | 99热精品国产三级在线观看 | 国产三级高清 | 在线亚洲黄色 |