/**
*用于将一个list集合转化为根节点只有一个的树结构
* @param list 需要转为树形结构的集合
* @param rootFlag 根节点的标志,如parentFlag字段为“0”等
* @param getKeyMethod 获取本节点的标识,一般为该对象的主键id或者flag,默认为String类型
* @param getParentKeyMethod 获取该节点的父标识,一般为parentId或者parentFlag,默认为String类型
* @param setChildrenMethod 设置本节点的子对象,获得对象默认为List<T>类型
* @return T 树结构
*/
public static <T> T listToTree(List<T> list, String rootFlag, Method getKeyMethod,
Method getParentKeyMethod, Method setChildrenMethod) {
try {
if (isEmptyOrNull(list)){
return null;
}
Map<String, List<T>> map = new HashMap<>();
for (T t : list) {
String parent = (String)getParentKeyMethod.invoke(t);
if (map.containsKey(parent)){
List<T> ts = map.get(parent);
ts.add(t);
}else {
List<T> list1 = new ArrayList<>();
list1.add(t);
map.put(parent, list1);
}
}
for (T t : list) {
String key = (String)getKeyMethod.invoke(t);
List<T> ts = map.get(key);
setChildrenMethod.invoke(t,ts);
}
for (T t : list) {
String parent = (String)getParentKeyMethod.invoke(t);
if(rootFlag.equals(parent)){
return t;
}
}
return null;
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
} catch (InvocationTargetException e) {
throw new RuntimeException(e);
}
}
03-13
1492
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)