您的当前位置:首页正文

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

2021-05-27 来源:客趣旅游网
JavaTree结构数据中查找匹配节点⽅式

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

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

@AllArgsConstructorpublic 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\北京\"); TreeNode treeNode1 = new TreeNode(\"124\丰台区\");

TreeNode treeNode2 = new TreeNode(\"125\海淀区\");

TreeNode treeNode3 = new TreeNode(\"126\丰台区丰台科技园\"); TreeNode treeNode4 = new TreeNode(\"127\丰台区丰台南路\"); TreeNode treeNode5 = new TreeNode(\"128\海淀区中关村\"); TreeNode treeNode6 = new TreeNode(\"129\海淀区海淀公园\"); TreeNode treeNode7 = new TreeNode(\"130\上海\");

TreeNode treeNode8 = new TreeNode(\"131\徐汇区\"); TreeNode treeNode9 = new TreeNode(\"132\虹⼝区\");

TreeNode treeNode10 = new TreeNode(\"133\徐汇区龙华寺\"); TreeNode treeNode11 = new TreeNode(\"134\徐汇区天主教堂\"); TreeNode treeNode12 = new TreeNode(\"135\虹⼝区虹⼝⾜球场\"); TreeNode treeNode13 = new TreeNode(\"136\虹⼝区鲁迅公园\");

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

运⾏后的结果:

以上这篇Java Tree结构数据中查找匹配节点⽅式就是⼩编分享给⼤家的全部内容了,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。

因篇幅问题不能全部显示,请点此查看更多更全内容