JAVA樹形結構工具類
BaseTreeObj.java
/**
* 基層樹形結構實體類
* 必備屬性:id,parentId,childsList
*/
@Data
public class BaseTreeObj implements Serializable {
private static final long serialVersionUID = 1L;
private String id;
private String parentId;
private String name;
private List<BaseTreeObj> childsList = new ArrayList<>();
}
TreeUtil.java
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.List;
/**
* 獲得樹形結構的工具類
* 實際使用,可將BaseTreeObj直接覆蓋為指定類
*/
public class TreeUtil {
/**
* 獲得指定節點下所有歸檔
* @param list
* @param parentId
* @return
*/
public static List<BaseTreeObj> list2TreeConverter(List<BaseTreeObj> list, String parentId) {
List<BaseTreeObj> returnList = new ArrayList<>();
for (BaseTreeObj res : list) {
//判斷對象是否為根節點
if (res.getParentId().equals(parentId)) {
//該節點為根節點,開始遞歸
recursionFn(list, res); //通過遞歸為節點設置childList
returnList.add(res);
}
}
return returnList;
}
/**
* 遞歸列表
* 通過遞歸,給指定t節點設置childList
* @param list
* @param t
*/
public static void recursionFn(List<BaseTreeObj> list, BaseTreeObj t) {
//只能獲取當前t節點的子節點集,並不是所有子節點集
List<BaseTreeObj> childsList = getChildList(list, t);
//設置他的子集對象集
t.setChildsList(childsList);
//迭代子集對象集
for (BaseTreeObj nextChild : childsList) { //遍歷完,則退出遞歸
//判斷子集對象是否還有子節點
if (!CollectionUtils.isEmpty(childsList)) {
//有下一個子節點,繼續遞歸
recursionFn(list, nextChild);
}
}
} /**
* 獲得指定節點下的所有子節點
* @param list
* @param t
* @return
*/
public static List<BaseTreeObj> getChildList(List<BaseTreeObj> list, BaseTreeObj t) {
List<BaseTreeObj> childsList = new ArrayList<BaseTreeObj>();
//遍歷集合元素,如果元素的Parentid==指定元素的id,則說明是該元素的子節點
for (BaseTreeObj t1 : list) {
if (t1.getParentId() .equals(t.getId()) ) {
childsList.add(t1);
}
}
return childsList;
} /**
* 判斷是否還有下一個子節點
* @param list
* @param t
*/
public static boolean hasChild(List<BaseTreeObj> list, BaseTreeObj t) {
return getChildList(list, t).size() > 0 ? true : false;
}
}