我就废话不多说了,大家还是直接看代码吧~
1
2
3
4
5
6
7
8
|
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
@Data
@AllArgsConstructor
public class TreeNode {
/**
* 节点ID
**/
private String id;
/**
* 父级ID
**/
private String parentId;
/**
* 节点名称
**/
private String name;
}
|
TreeNodeTest
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
|
/**
* 测试类
* 此方法建议数据量少的情况使用 或者 此数据很少变动并且加入到缓存中
*/
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" , "123" , "海淀区" );
TreeNode treeNode3 = new TreeNode( "126" , "124" , "丰台区丰台科技园" );
TreeNode treeNode4 = new TreeNode( "127" , "124" , "丰台区丰台南路" );
TreeNode treeNode5 = new TreeNode( "128" , "125" , "海淀区中关村" );
TreeNode treeNode6 = new TreeNode( "129" , "125" , "海淀区海淀公园" );
TreeNode treeNode7 = new TreeNode( "130" , "0" , "上海" );
TreeNode treeNode8 = new TreeNode( "131" , "130" , "徐汇区" );
TreeNode treeNode9 = new TreeNode( "132" , "130" , "虹口区" );
TreeNode treeNode10 = new TreeNode( "133" , "131" , "徐汇区龙华寺" );
TreeNode treeNode11 = new TreeNode( "134" , "131" , "徐汇区天主教堂" );
TreeNode treeNode12 = new TreeNode( "135" , "132" , "虹口区虹口足球场" );
TreeNode treeNode13 = new TreeNode( "136" , "132" , "虹口区鲁迅公园" );
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结构数据中查找匹配节点方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/mbh12333/article/details/85774067