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查詢的示例代碼,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-09-09
Java BeanUtils.copyProperties的詳解
這篇文章主要介紹了Java BeanUtils.copyProperties的詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下2021-08-08

