Java Tree结构数据中查找匹配节点方式

2025-05-29 0 106

我就废话不多说了,大家还是直接看代码吧~

?

1

2

3

4

5

6

7

8
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

?

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结构数据中查找匹配节点方式

以上这篇Java Tree结构数据中查找匹配节点方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持快网idc。

原文链接:https://blog.csdn.net/mbh12333/article/details/85774067

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 Java Tree结构数据中查找匹配节点方式 https://www.kuaiidc.com/117578.html

相关文章

发表评论
暂无评论