import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class TreeUtil { // private static String PID = "000000"; /** * 將平行的樹,轉化為一顆有層級關系的樹 * @param list * @param pId * @return */ public static List<TreeData> getTreeList(List<TreeData> list,String pId){ if (list == null){ return null; } //獲取所有頭節點 List<TreeData> rootNode = new ArrayList<>(); for (TreeData treeData: list ){ if (treeData.getId().equals(pId)){ rootNode.add(treeData); } } //頭節點不存在的情況 if (rootNode.size() == 0){ return getChild(pId,list); } //頭節點存在的情況 for (TreeData treeData : rootNode){ String id = treeData.getId(); treeData.setChild(getChild(id,list)); } return rootNode; } private static List<TreeData> getChild(String id,List<TreeData> list){ //找到id節點子節點 List<TreeData> childList = new ArrayList<>(); for (TreeData treeData: list){ if (treeData.getpId().equals(id)){ childList.add(treeData); } } //給子節點設置子節點 for (TreeData treeData : childList){ id = treeData.getId(); //遞歸 treeData.setChild(getChild(id,list)); } if (childList.size() == 0){ return null; } return childList; } /** * 獲取指定層級的樹 * @param treeList * @param level * @return */ public static List<TreeData> getTreeNodeOnLevel(List<TreeData> treeList,int level){ if (treeList == null && treeList.size() == 0){ return new ArrayList<>(); } ArrayList<TreeData> treeListOnLevel = new ArrayList<>(); //調用遞歸方法 treeList = TreeUtil.recursionQueryTree(treeList, treeListOnLevel, 0,level); return treeList; } /** * 遞歸查所有指定層級的樹節點 * @param treeList * @param treeListOnLevel * @param currentLevel * @param level * @return */ private static List<TreeData> recursionQueryTree(List<TreeData> treeList,List<TreeData> treeListOnLevel,int currentLevel,int level){ currentLevel++; //遞歸循環查詢指定層級樹 for (TreeData treeData : treeList){ if (currentLevel == level){ treeListOnLevel.add(treeData); continue; } //遞歸 if (treeData.getChild() == null || treeData.getChild().size() == 0){ continue; } recursionQueryTree(treeData.getChild(),treeListOnLevel,currentLevel,level); } return treeListOnLevel; } /** * 統計一顆樹的深度 * @param treeList * @return */ public static int getTreeLevel(List<TreeData> treeList){ if (treeList == null || treeList.size() == 0){ return 0; } //調用遞歸統計方法 return TreeUtil.recursionCount(treeList,0,0); } private static int recursionCount(List<TreeData> treeList,int currentlevel,int maxlevel){ currentlevel++; //當當前層級大於目前最大層級時覆蓋 if (currentlevel > maxlevel){ maxlevel = currentlevel; } //遞歸遍歷節點 for (TreeData treeData : treeList){ //如果子節點為空不進行遞歸 if (treeData.getChild() == null || treeData.getChild().size() == 0){ continue; } //遞歸 maxlevel = recursionCount(treeData.getChild(), currentlevel, maxlevel); } return maxlevel; } /** * 獲取指定id在此樹中的層級位置 * * @param list 要遍歷的樹 * @param id 要尋找的節點Id * @param rankCount 層級統計器,傳入0即可 * @return */ public static Map<String,Object> getNode(List<TreeData> list,String id,Integer rankCount){ TreeData node = null; //計數器加一 rankCount++; Map<String,Object> map = new HashMap<>(); map.put("node",node); map.put("rankCount",rankCount); //如果傳入的樹為0或返回層級0 if (list == null || list.size() == 0){ map.put("rankCount",0); return map; } //遍歷樹 for (TreeData treeData : list){ if (treeData.getId().equals(id)){ map.put("node",treeData); return map; } if (treeData.getChild() == null || treeData.getChild().size() == 0){ continue; } //遞歸 Map<String,Object> map1 = getNode(treeData.getChild(),id,rankCount); if (map1.get("node") != null){ return map1; } } //如果傳入的節點是不存在的,返回層級0 map.put("rankCount",0); return map; } }
import java.util.List; public class TreeData { private String id; private String name; private String pId; private List<TreeData> child; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getpId() { return pId; } public void setpId(String pId) { this.pId = pId; } public List<TreeData> getChild() { return child; } public void setChild(List<TreeData> child) { this.child = child; } @Override public String toString() { return "TreeData{" + "id='" + id + '\'' + ", name='" + name + '\'' + ", pId='" + pId + '\'' + ", child=" + child + '}'; } }