我最近寫到了一個項目中用到了樹形圖,不得不說這個樹形圖是真的扯淡; 我用到的是layui中的樹形圖,再展示數據過程中遇到了很多的問題,廢話不多說,直接貼代碼。 一、調用排序介面,對數據進行排序。 二、生成樹結構 ...
我最近寫到了一個項目中用到了樹形圖,不得不說這個樹形圖是真的扯淡;
我用到的是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判斷試一下看行不行。
只有一個數據的話排序會拋異常,因為趕需求我也沒更仔細的看。還有就是你的排序欄位給的值千萬別重覆!!!
如果你的問題還是解決不了,可以私聊我。