话不多说,上代码:
/** 把列表转换为树结构
*
* @param originalList 原始list数据
*/
public List<对象> listTree(List<对象> originalList) {
// 获取根节点,即找出父节点为空的对象
List<对象> rootNodeList = new ArrayList<>();
for (对象 t : originalList) {
//父级id
if (t.getPid() == 0) {
//保证了有子级的在前面
rootNodeList.add(0, t);
}
}
// 将根节点从原始list移除,减少下次处理数据
originalList.removeAll(rootNodeList);
// 递归封装树
try {
packTree(rootNodeList, originalList);
} catch (Exception e) {
e.printStackTrace();
}
return rootNodeList;
}
/**
* 封装树(向下递归)
*
* @param parentNodeList 要封装为树的父节点对象集合
* @param originalList 原始list数据
*/
public void packTree(List<对象> parentNodeList, List<对象> originalList) {
for (对象 parentNode : parentNodeList) {
// 找到当前父节点的子节点列表
List<对象> children = packChildren(parentNode, originalList);
if (children.isEmpty()) {
continue;
}
parentNode.setChildren(children);
// 将当前父节点的子节点从原始list移除,减少下次处理数据
originalList.removeAll(children);
// 开始下次递归
packTree(children, originalList);
}
}
/**
* 封装子对象
* @param parentNode 父节点对象
* @param originalList 原始list数据
*/
public List<对象> packChildren(对象 parentNode, List<对象> originalList) {
// 找到当前父节点下的子节点列表
List<对象> childNodeList = new ArrayList<>();
Integer parentId = parentNode.getYfMaterialDataId();
for (对象 t : originalList) {
//父级id
Integer childNodeParentId = t.getPid();
if (parentId.equals(childNodeParentId)) {
childNodeList.add(t);
}
}
return childNodeList;
}