java List 转树结构

需求 ,将如下类似的list  

java List 转树结构_第1张图片

转换成如下树结构

{
    "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 allRegion = regionMapper.allRegion();
        Map> idToRegionMap = new HashMap<>(32);
        for (Region region:allRegion) {
            idToRegionMap.put(region.getId(),toNode(region));
        }

toNode 方法是根据业务提取相应信息转成map 存储节点数据

private Map toNode(Region region){
        Map 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 toTree(Map> idToRegionMap){
//        根节点
        Map rootTree = new HashMap<>(8);
        rootTree.put("gridName","全部");
        rootTree.put("child",new ArrayList>());

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

            }else {
//        添加到根节点
                List> child = (List>) rootTree.get("child");
                child.add(node);
            }
        }

        return rootTree;
    }

完成

你可能感兴趣的:(java,学习笔记)