普通LIST列表转换为Tree
本文转载至:http://blog.csdn.net/qw7501312/article/details/51544230
public class XMGLTaskDTO {
String name;
Long parentId;
Long id;
List<XMGLTaskDTO > childrenTaskList;
}
//重新将list转为tree-----------------方式1(循环)
List<XMGLTaskDTO > nodeList = new ArrayList();
for(XMGLTaskDTO node1 : taskDTOList){//taskDTOList 是数据库获取的List列表数据或者来自其他数据源的List
boolean mark = false;
for(XMGLTaskDTO node2 : taskDTOList){
if(node1.getParentId()!=null && node1.getParentId().equals(node2.getId())){
mark = true;
if(node2.getChildrenTaskList() == null)
node2.setChildrenTaskList(new ArrayList<XMGLTaskDTO>());
node2.getChildrenTaskList().add(node1);
break;
}
}
if(!mark){
nodeList.add(node1);
}
}
//重新将list转为tree-----------------方式2(递归)
List<XMGLTaskDTO > nodeList = new ArrayList();
nodeList = constructTaskDTOToTree(taskDTOList );//taskDTOList 是数据库获取的List列表数据或者来自其他数据源的List
/**
* 将List重组为数
* @param taskDTOList DTO集合
* @return List<XMGLTaskDTO>
*/
public List<XMGLTaskDTO> constructTaskDTOToTree(List<XMGLTaskDTO> taskDTOList){
//key:父节点ID value:子节点集合
Map<Long,List<XMGLTaskDTO>> taskDTOMap = new HashMap<>();
//将List重组到Map中
taskDTOList.forEach(dto -> {
List<XMGLTaskDTO> tempTaskDTOList = taskDTOMap.get(dto.getParentId());
if (tempTaskDTOList == null){
tempTaskDTOList = new ArrayList<XMGLTaskDTO>();
taskDTOMap.put(dto.getParentId(),tempTaskDTOList);
}
tempTaskDTOList.add(dto);
});
//顶级节点集合
List<XMGLTaskDTO> resultTaskDTOList = taskDTOMap.get(null);
recurTaskDTOList(resultTaskDTOList,taskDTOMap);
return resultTaskDTOList;
}
/**
* 将重组好的Map进行树形结构处理
* @param taskDTOList 父节点集合(不一定是顶级节点 因为会递归调用)
* @param sourceMap 组装好的Map集合
*/
public void recurTaskDTOList(List<XMGLTaskDTO> taskDTOList,Map<Long,List<XMGLTaskDTO>> sourceMap){
if(CollectionUtils.isEmpty(taskDTOList))
return;
taskDTOList.forEach(dto -> {
dto.setChildrenTaskList(sourceMap.get(dto.getId()));
recurTaskDTOList(dto.getChildrenTaskList(),sourceMap);
});
}