欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

java递归展示树形图代码实现以及遇到的问题

程序员文章站 2022-04-09 08:37:33
我最近写到了一个项目中用到了树形图,不得不说这个树形图是真的扯淡; 我用到的是layui中的树形图,再展示数据过程中遇到了很多的问题,废话不多说,直接贴代码。 一、调用排序接口,对数据进行排序。 二、生成树结构 ......

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

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

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

java递归展示树形图代码实现以及遇到的问题

二、生成树结构

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

//查询所有菜单
//根节点
try {
list<treevo> 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<treevo> 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<treevo> getchild(string id,list<wfunit> allmenu){
if(allmenu.size() == 0){ //这里用来结束循环,一开始我用的for循环,发现会进入死循环,然后换成了迭代器。
return null;
}
//子菜单
list<treevo> childlist = new arraylist<treevo>();
iterator<wfunit> 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<treevo> 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<treevo>();
}
system.out.println(s);
}
system.out.println(childlist);
return childlist;
}
最后给大家总结一下,这个排序有个问题,就是你的根节点不能只有一个数据,你们可以加个if判断试一下看行不行。
只有一个数据的话排序会抛异常,因为赶需求我也没更仔细的看。还有就是你的排序字段给的值千万别重复!!!
如果你的问题还是解决不了,可以私聊我。