您好,登錄后才能下訂單哦!
本篇文章為大家展示了Java Tree結(jié)構(gòu)數(shù)據(jù)中如何查找匹配節(jié)點(diǎn),內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。
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樹形結(jié)構(gòu)根據(jù)父級(jí)節(jié)點(diǎn)獲取其下面的所有最底層的根節(jié)點(diǎn)數(shù)據(jù)
因工作中需要根據(jù)任意父級(jí)節(jié)點(diǎn)查找到樹形節(jié)點(diǎn)下的根節(jié)點(diǎn)信息,所以寫了下面一個(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)沒有 此時(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 * 上面的樹形結(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é)果:
上述內(nèi)容就是Java Tree結(jié)構(gòu)數(shù)據(jù)中如何查找匹配節(jié)點(diǎn),你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。