import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.reflect.FieldUtils;
import java.util.ArrayList;
import java.util.List;
public class MakeTreeUtils {
/**
* 把列表转换为树结构
*
* @param originalList 原始list数据
* @param keyName 作为唯一标示的字段名称
* @param parentFieldName 父节点实体属性名称
* @param childrenFieldName 子节点实体属性名称一般为一个List集合
* @return 组装后的集合
*/
public static <T> List<T> buildTree(List<T> originalList, String keyName,String parentFieldName,String childrenFieldName ) throws Exception {
// 获取根节点,即找出父节点为空的对象
List<T> parentList = new ArrayList<>();
for (int i = 0; i < originalList.size(); i++) {
T t = originalList.get(i);
String parentId = BeanUtils.getProperty(t, parentFieldName);
if (StringUtils.isBlank(parentId) || "-1".equals(parentId) || "0".equals(parentId) ) {
parentList.add(t);
}
}
// 将根节点从原始list移除,减少下次处理数据
originalList.removeAll(parentList);
// 递归封装树
makeTree(parentList, originalList, keyName, parentFieldName, childrenFieldName);
return parentList;
}
/**
* 封装树
*
* @param parentList 要封装为树的父对象集合
* @param originalList 原始list数据
* @param keyName 作为唯一标示的字段名称
* @param parentFieldName 模型中作为parent字段名称
* @param childrenFieldName 模型中作为children的字段名称
*/
private static <T> void makeTree(List<T> parentList, List<T> originalList, String keyName, String parentFieldName, String childrenFieldName) throws Exception {
for (int i = 0; i < parentList.size(); i++) {
List<T> children = makeChildren(parentList.get(i), originalList, keyName, parentFieldName, childrenFieldName);
if (children.isEmpty()) {
continue;
}
originalList.removeAll(children);
makeTree(children, originalList, keyName, parentFieldName, childrenFieldName);
}
}
/**
* 封装子对象
*
* @param parent 父对象
* @param originalList 待处理对象集合
* @param keyName 作为唯一标示的字段名称
* @param parentFieldName 模型中作为parent字段名称
* @param childrenFieldName 模型中作为children的字段名称
*/
private static <T> List<T> makeChildren(T parent, List<T> originalList, String keyName, String parentFieldName, String childrenFieldName) throws Exception {
List<T> childList = new ArrayList<>();
String parentId = BeanUtils.getProperty(parent, keyName);
for (int i = 0; i < originalList.size(); i++) {
T t = originalList.get(i);
String childParentId = BeanUtils.getProperty(t, parentFieldName);
if (parentId.equals(childParentId)) {
childList.add(t);
}
}
if (!childList.isEmpty()) {
FieldUtils.writeField(parent, childrenFieldName, childList, true);
}
return childList;
}
}
将List 对象封装成一棵树
最新推荐文章于 2022-05-31 15:58:48 发布