1. 程式人生 > >普通LIST列表轉換為Tree

普通LIST列表轉換為Tree

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);
        });
    }