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

网友投稿 361 2022-11-22


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

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

private boolean contains(List 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 classSwZNrAi 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

* / \SwZNrAi / \ / \ / \

* 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 TreeNodhttp://e("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 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> groupByParentIdMap = treeNodes.stream()

.collect(Collectors.groupingBy(TreeNode::getParentId));

// 存放 0:对应的所有根节点ID数据

Set topToLowerChildIdSet = new HashSet<>();

// 取出顶级数据(也就是父级ID为0的数据 当然顶层的父级ID也可以自定义 这里只是演示 所以给了0)

List 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> peopleByCity = personStream.collect(Collectors.groupingBy(Person::getCity));

* @param pid 父级ID

* @param topToLowerChildIdSet 存储最深根节点的数据集合

*/

public static Set getMinimumChildIdArray(Map> groupByParentIdMap,

String pid, Set topToLowerChildIdSet){

// 存放当前pid对应的所有根节点ID数据

Set currentPidLowerChildIdSet = new HashSet<>();

// 获取当前pid下所有的子节点

List childTreeNodes = groupByParentIdMap.get(pid);

if(CollUtil.isEmpty(childTreeNodes)){

return null;

}

for(TreeNode treeNode : childTreeNodes){

Set 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;

}

}

运行后的结果:


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:SpringBoot中使用JeecgBoot的Autopoi导出Excel的方法步骤
下一篇:SpringBoot中整合MyBatis
相关文章

 发表评论

暂时没有评论,来抢沙发吧~