Java Tree结构数据中查找匹配节点方式
程序员文章站
2022-04-01 15:48:39
我就废话不多说了,大家还是直接看代码吧~private boolean contains(list children, string value) { for (tree...
我就废话不多说了,大家还是直接看代码吧~
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
@data @allargsconstructor public 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","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结构数据中查找匹配节点方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。