java 树状 子节点_java构建树形列表(带children属性)
/*** 樹形表格工具類
*
*@authoryanggb*/
public classTreeTableUtil {/*** 把列表轉換為樹結構
*
*@paramoriginalList 原始list數據
*@paramidFieldName 作為唯一標示的字段名稱
*@parampidFieldName 父節點標識字段名
*@paramchildrenFieldName 子節點(列表)標識字段名
*@return樹結構列表*/
public static List list2TreeList(ListoriginalList, String idFieldName, String pidFieldName,
String childrenFieldName) {//獲取根節點,即找出父節點為空的對象
List rootNodeList = new ArrayList<>();for(T t : originalList) {
String parentId= null;try{
parentId=BeanUtils.getProperty(t, pidFieldName);
}catch (IllegalAccessException | InvocationTargetException |NoSuchMethodException e) {
e.printStackTrace();
}if(StringUtils.isBlank(parentId)) {
rootNodeList.add(0, t);
}
}//將根節點從原始list移除,減少下次處理數據
originalList.removeAll(rootNodeList);//遞歸封裝樹
try{
packTree(rootNodeList, originalList, idFieldName, pidFieldName, childrenFieldName);
}catch(Exception e) {
e.printStackTrace();
}returnrootNodeList;
}/*** 封裝樹(向下遞歸)
*
*@paramparentNodeList 要封裝為樹的父節點對象集合
*@paramoriginalList 原始list數據
*@paramkeyName 作為唯一標示的字段名稱
*@parampidFieldName 父節點標識字段名
*@paramchildrenFieldName 子節點(列表)標識字段名*/
private static void packTree(List parentNodeList, ListoriginalList, String keyName,
String pidFieldName, String childrenFieldName)throwsException {for(T parentNode : parentNodeList) {//找到當前父節點的子節點列表
List children =packChildren(parentNode, originalList, keyName, pidFieldName, childrenFieldName);if(children.isEmpty()) {continue;
}//將當前父節點的子節點從原始list移除,減少下次處理數據
originalList.removeAll(children);//開始下次遞歸
packTree(children, originalList, keyName, pidFieldName, childrenFieldName);
}
}/*** 封裝子對象
*
*@paramparentNode 父節點對象
*@paramoriginalList 原始list數據
*@paramkeyName 作為唯一標示的字段名稱
*@parampidFieldName 父節點標識字段名
*@paramchildrenFieldName 子節點(列表)標識字段名*/
private static List packChildren(T parentNode, ListoriginalList, String keyName, String pidFieldName,
String childrenFieldName)throwsException {//找到當前父節點下的子節點列表
List childNodeList = new ArrayList<>();
String parentId=BeanUtils.getProperty(parentNode, keyName);for(T t : originalList) {
String childNodeParentId=BeanUtils.getProperty(t, pidFieldName);if(parentId.equals(childNodeParentId)) {
childNodeList.add(t);
}
}//將當前父節點下的子節點列表寫入到當前父節點下(給子節點列表字段賦值)
if (!childNodeList.isEmpty()) {
FieldUtils.writeDeclaredField(parentNode, childrenFieldName, childNodeList,true);
}returnchildNodeList;
}
}
總結
以上是生活随笔為你收集整理的java 树状 子节点_java构建树形列表(带children属性)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vba excel 退出编辑状态_偷梁换
- 下一篇: C语言非常大的数组,关于最大子数组问题