Java递归一个四十万的树结构_java递归展示树形图代码实现以及遇到的问题

我最近写到了一个项目中用到了树形图,不得不说这个树形图是真的扯淡;

我用到的是layui中的树形图,再展示数据过程中遇到了很多的问题,废话不多说,直接贴代码。

一、调用排序接口,对数据进行排序。

75a5b3cf186c24b2f8663c5f246520be.png

二、生成树结构

public static list findtree(list allmenu){ //这里treevo是我写了一个跟layui树形图结构一样结构的实体类,wfunit是我数据库表的实体类。

//查询所有菜单

//根节点

try {

list tree = new arraylist<>();

for (wfunit nav : allmenu) {

system.out.println(nav.getownerunitid());

if (nav.getownerunitid().equals("0")) {//父节点是0的,为根节点,这里getownerunitid是我关联id自连接。

treevo t = new treevo();

t.setid(nav.getunitid());

t.setname(nav.getunitname());

t.setlevel(nav.getunitlevel());

t.setownerunitid(nav.getownerunitid());

t.setsequence(nav.getunitsequence());

tree.add(t);

}

}

/* 根据实体类的树等级排序 */

collections.sort(tree, level());

//为根菜单设置子菜单,getclild是递归调用的

for (treevo nav : tree) {

/* 获取根节点下的所有子节点 使用getchild方法*/

list childlist = getchild(nav.getid(), allmenu);

system.out.println(childlist);

nav.setchildren(childlist);//给根节点设置子节点

}

return tree;

} catch (exception e) {

return null;

}

}

三、遍历子树

/**

* 获取子节点

* @param id 父节点id

* @param allmenu 所有菜单列表

* @return 每个根节点下,所有子菜单列表

*/

public static list getchild(string id,list allmenu){

if(allmenu.size() == 0){ //这里用来结束循环,一开始我用的for循环,发现会进入死循环,然后换成了迭代器。

return null;

}

//子菜单

list childlist = new arraylist();

iterator it = allmenu.iterator();

while(it.hasnext()){

wfunit s = it.next();

if(s.getownerunitid().equals(id)){

//1.迭代就是迭代,不要对集合进行修改

childlist.add(new treevo(s.getunitid(),s.getunitname(),s.getunitlevel(),s.getownerunitid(),s.getunitsequence()));

it.remove();

}

}

listiterator listit = childlist.listiterator();

system.out.println(childlist);

while(listit.hasnext()){

treevo s = listit.next();

s.setchildren(getchild(s.getid(), allmenu));

collections.sort(childlist,level());//排序

//如果节点下没有子节点,返回一个空list(递归退出)

if(childlist.size() == 0){

return new arraylist();

}

system.out.println(s);

}

system.out.println(childlist);

return childlist;

}

最后给大家总结一下,这个排序有个问题,就是你的根节点不能只有一个数据,你们可以加个if判断试一下看行不行。

只有一个数据的话排序会抛异常,因为赶需求我也没更仔细的看。还有就是你的排序字段给的值千万别重复!!!

如果你的问题还是解决不了,可以私聊我。

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值