普通LIST列表轉換為Tree
阿新 • • 發佈:2019-01-31
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); }); }