java遞歸展示樹形圖代碼實現以及遇到的問題
阿新 • • 發佈:2019-05-16
tle 連接 遍歷 com cep ont 關聯 get cli
我最近寫到了一個項目中用到了樹形圖,不得不說這個樹形圖是真的扯淡;
我用到的是layui中的樹形圖,再展示數據過程中遇到了很多的問題,廢話不多說,直接貼代碼。
一、調用排序接口,對數據進行排序。
二、生成樹結構
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判斷試一下看行不行。
只有一個數據的話排序會拋異常,因為趕需求我也沒更仔細的看。還有就是你的排序字段給的值千萬別重復!!!
如果你的問題還是解決不了,可以私聊我。
java遞歸展示樹形圖代碼實現以及遇到的問題