java List 轉樹結構

需求 ,將如下類似的list  

轉換成如下樹結構

{
    "code":200,
    "data":{
        "gridName":"全部",
        "child":[
            {
                "id":1,
                "gridName":"華東區",
                "gridCode":"ss",
                "parentId":null,
                "child":[
                    {
                        "id":3,
                        "gridName":"浙江省",
                        "gridCode":null,
                        "parentId":1
                    },
                    {
                        "id":4,
                        "gridName":"湖南省",
                        "gridCode":null,
                        "parentId":1
                    }
                ]
            },
            {
                "id":2,
                "gridName":"花唄區",
                "gridCode":"bb",
                "parentId":null,
                "child":[
                    {
                        "id":5,
                        "gridName":"江西省",
                        "gridCode":null,
                        "parentId":2
                    }
                ]
            }
        ]
    },
    "message":"成功!"
}

 

前提條件  :list 的實體類中需要幾個必要的屬性

public class Region {
    /**
     *  id  字段名 : id
     */
    private Long id;

    /**
     *  區劃代碼  字段名 : code
     */
    private String code;

    /**
     *  區劃名稱  字段名 : name
     */
    private String name;

    /**
     *  上級區劃id  字段名 : parentRegionId
     */
    private Long parentRegionId;
}

首先將list 轉成對應的 (id : Map) 的map 方便通過id獲取相應節點

        List<Region> allRegion = regionMapper.allRegion();
        Map<Long, Map<String, Object>> idToRegionMap = new HashMap<>(32);
        for (Region region:allRegion) {
            idToRegionMap.put(region.getId(),toNode(region));
        }

toNode 方法是根據業務提取相應信息轉成map 存儲節點數據

private Map<String ,Object> toNode(Region region){
        Map<String, Object> node = new HashMap<>(8);
        node.put("id",region.getId());
        node.put("gridCode",region.getCode());
        node.put("gridName",region.getName());
        node.put("parentId",region.getParentRegionId());
        return node;
    }

最後是轉換樹結構的操作 看註釋

 

/**
     * 節點list 轉成樹
     * @param idToRegionMap
     * @return
     */
    private Map<String, Object> toTree(Map<Long, Map<String, Object>> idToRegionMap){
//        根節點
        Map<String, Object> rootTree = new HashMap<>(8);
        rootTree.put("gridName","全部");
        rootTree.put("child",new ArrayList<Map<String, Object>>());

//       遍歷,有父節點就和添加到父節點parentNode的child下面,沒有父節點就添加到根節點child的下面
        for (Map<String, Object> node: idToRegionMap.values()) {
//       添加到父節點的child
            if(idToRegionMap.containsKey(node.get("parentId"))){
                Map<String, Object> parentNode = idToRegionMap.get(node.get("parentId"));
                if(parentNode.containsKey("child")){
                    List<Map<String, Object>> child = (List<Map<String, Object>>) parentNode.get("child");
                    child.add(node);
                }else {
                    List<Map<String, Object>> child = new ArrayList<>();
                    child.add(node);
                    parentNode.put("child",child);
                }

            }else {
//        添加到根節點
                List<Map<String, Object>> child = (List<Map<String, Object>>) rootTree.get("child");
                child.add(node);
            }
        }

        return rootTree;
    }

完成

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章