public class ListTreeUtils {
public static <E> List<E> getTreeList(List<String> topId, List<E> entityList,String idKey, String parentIdKey, String childListKey) {
List<E> resultList = new ArrayList<>();
// 获取顶层元素集合
String id;
for (E entity : entityList) {
id = getValueByPropName(entity, idKey);
if (topId.contains(id)) {
resultList.add(entity);
}
}
// 获取每个顶层元素的子数据集合
for (E entity : resultList) {
setValueByPropName(entity,childListKey, getSubList(getValueByPropName(entity, idKey).toString(), entityList,idKey,parentIdKey,childListKey));
}
return resultList;
}
public static <E> List<E> getTreeList(String topId, List<E> entityList,String idKey, String parentIdKey, String childListKey) {
List<E> resultList = new ArrayList<>();
// 获取顶层元素集合
String parentId;
for (E entity : entityList) {
parentId = getValueByPropName(entity, parentIdKey);
if (parentId == null || topId.equals(parentId)) {
resultList.add(entity);
}
}
// 获取每个顶层元素的子数据集合
for (E entity : resultList) {
setValueByPropName(entity,childListKey, getSubList(getValueByPropName(entity, idKey).toString(), entityList,idKey,parentIdKey,childListKey));
}
return resultList;
}
/**
* * 获取子数据集合
*
* @param id
* @param entityList
* @return
*/
private static <E> List<E> getSubList(String id, List<E> entityList, String idKey, String parentIdKey, String childListKey) {
List<E> childList = new ArrayList<>();
String parentId;
// 子集的直接子对象
for (E entity : entityList) {
parentId = getValueByPropName(entity, parentIdKey);
if (id.equals(parentId)) {
childList.add(entity);
}
}
// 子集的间接子对象
for (E entity : childList) {
setValueByPropName(entity,childListKey, getSubList(getValueByPropName(entity, idKey).toString(), entityList,idKey,parentIdKey,childListKey));
}
// 递归退出条件
if (childList.size() == 0) {
return null;
}
return childList;
}
// 通过属性获取传入对象的指定属性的值
public static <T> T getValueByPropName(Object object, String propName) {
T value = null;
try {
// 通过属性获取对象的属性
Field field = object.getClass().getDeclaredField(propName);
// 对象的属性的访问权限设置为可访问
field.setAccessible(true);
// 获取属性的对应的值
value = (T)field.get(object);
} catch (Exception e) {
return null;
}
return value;
}
// 通过属性设置传入对象的指定属性的值
public static <U> void setValueByPropName(Object object, String propName, U updateValue) {
try {
// 通过属性获取对象的属性
Field field = object.getClass().getDeclaredField(propName);
// 对象的属性的访问权限设置为可访问
field.setAccessible(true);
// 设置属性的对应的值
field.set(object, updateValue);
} catch (Exception e) {
}
}
}
树节点操作(返回树形结构)
最新推荐文章于 2023-03-24 11:28:46 发布