1. 程式人生 > 其它 >list組裝轉化為樹形結構list

list組裝轉化為樹形結構list

    /**
     * 使用遞迴方法構建分割槽樹
     * @param dtoList
     * @param level0Root
     * @return
     */
    public static List<DtoList> buildDmaTree(List<DtoList> dtoList, boolean level0Root) {
        List<DtoList> trees = new ArrayList<>();

        List<Integer> rootIdList = (level0Root ?  getDmaLvl0Root(dtoList): getDmaInfoRoots(dtoList));
        
for (DtoList dto : dtoList) { if (rootIdList.contains(dto.getId())) { trees.add(findDmaChildren(dto, dtoList)); } } return trees; } /** * 查詢分割槽根節點(直接根據父節點ID來判斷) * * @param dtoList */ private static List<Integer> getDmaLvl0Root(List<DtoList> dtoList) { List
<Integer> rootIdList = new ArrayList<>(); for(DtoList dto : dtoList) { if(dto.getXdiLevel() == 0) { rootIdList.add(dto.getId()); break; } } return rootIdList; } /** * 查詢分割槽根節點(因使用者許可權的原因,所以不能直接根據父節點ID來判斷) * *
@param dtoList */ private static List<Integer> getDmaInfoRoots(List<DtoList> dtoList) { List<Integer> rootIdList = new ArrayList<>(); Map<Integer, DtoList> dtoMap = dtoList.stream().collect(Collectors.toMap(DtoList::getId, v -> v, (v1, v2) -> v1)); for(DtoList dto : dtoList) { if(dto.getParentId() <= 0) { rootIdList.add(dto.getId()); continue; } if(!dtoMap.containsKey(dto.getParentId())) { rootIdList.add(dto.getId()); continue; } } return rootIdList; } /** * 遞迴查詢分割槽子節點 * @param dtoList * @return */ private static DtoList findDmaChildren(DtoList dto, List<DtoList> dtoList) { for (DtoList it : dtoList) { if(it.getParentId() > 0 && dto.getId().equals(it.getParentId())) { dto.setLeaf(false); dto.getChildren().add(findDmaChildren(it, dtoList)); } } if(dto.getChildren().size() <= 0) { dto.setChildren(null); } return dto; }