Java Tree結構資料中查詢匹配節點方式
阿新 • • 發佈:2020-09-11
我就廢話不多說了,大家還是直接看程式碼吧~
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樹形結構根據父級節點獲取其下面的所有最底層的根節點資料
因工作中需要根據任意父級節點查詢到樹形節點下的根節點資訊,所以寫了下面一個demo方便自己需要時的檢視以及需要的人蔘考
一共兩個類
TreeNode 使用了lombok外掛
TreeNodeTest
主要的邏輯都在TreeNodeTest中 如果有錯誤的地方,還望留言評論,感謝
TreeNode
@Data @AllArgsConstructor public class TreeNode { /** * 節點ID **/ private String id; /** * 父級ID **/ private String parentId; /** * 節點名稱 **/ 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 * 只支援 節點路徑長度必須一致的情況下才可以 * 此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","海淀區"); TreeNode treeNode3 = new TreeNode("126","124","豐臺區豐臺科技園"); TreeNode treeNode4 = new TreeNode("127","豐臺區豐臺南路"); TreeNode treeNode5 = new TreeNode("128","125","海淀區中關村"); TreeNode treeNode6 = new TreeNode("129","海淀區海淀公園"); TreeNode treeNode7 = new TreeNode("130","上海"); TreeNode treeNode8 = new TreeNode("131","130","徐彙區"); TreeNode treeNode9 = new TreeNode("132","虹口區"); TreeNode treeNode10 = new TreeNode("133","131","徐彙區龍華寺"); TreeNode treeNode11 = new TreeNode("134","徐彙區天主教堂"); TreeNode treeNode12 = new TreeNode("135","132","虹口區虹口足球場"); TreeNode treeNode13 = new TreeNode("136","虹口區魯迅公園"); 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:對應的所有根節點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節點下所有的根節點資料集合:" + topToLowerChildIdSet.toString()); } /** * 根據父級節點獲取最低層次 那一級的節點資料 * 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 儲存最深根節點的資料集合 */ public static Set<String> getMinimumChildIdArray(Map<String,List<TreeNode>> groupByParentIdMap,String pid,Set<String> topToLowerChildIdSet){ // 存放當前pid對應的所有根節點ID資料 Set<String> currentPidLowerChildIdSet = new HashSet<>(); // 獲取當前pid下所有的子節點 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節點為最底層的節點 currentPidLowerChildIdSet.add(treeNode.getId()); } } System.out.println("當前父級ID:"+ pid + "下所有的根節點資料:" + currentPidLowerChildIdSet.toString()); // 把當前獲取到的根節點資料 一併儲存到上一個節點父級ID集合中 topToLowerChildIdSet.addAll(currentPidLowerChildIdSet); return currentPidLowerChildIdSet; } }
執行後的結果:
以上這篇Java Tree結構資料中查詢匹配節點方式就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。