美文网首页
将一个List.map根据父节点ID转成树状结构

将一个List.map根据父节点ID转成树状结构

作者: Time一柒 | 来源:发表于2020-04-27 10:12 被阅读0次

    工具类

    import com.alibaba.fastjson.JSON;
    import com.alibaba.fastjson.JSONArray;
    /**
    
         - Map listToTree
         - <p>方法说明<p>
         - 将JSONArray数组转为树状结构
         - @param arr 需要转化的数据
         - @param id 数据唯一的标识键值
         - @param pid 父id唯一标识键值
         - @param child 子节点键值
         - @return JSONArray
         */
        public static JSONArray listToTree(JSONArray arr, String id, String pid, String child){
            JSONArray r = new JSONArray();
            JSONObject hash = new JSONObject();
            //将数组转为Object的形式,key为数组中的id
            for(int i=0;i<arr.size();i++){
                JSONObject json = (JSONObject) arr.get(i);
                hash.put(json.getString(id), json);
            }
            //遍历结果集
            for(int j=0;j<arr.size();j++){
                //单条记录
                JSONObject aVal = (JSONObject) arr.get(j);
                            //解决key为空的问题(数据库中父节点列为空)
                //判断JSONObject是否存在这个key值
                if(!aVal.containsKey(pid)){
                    aVal.put(pid,"000");
                }
                //在hash中取出key为单条记录中pid的值
                JSONObject hashVP = (JSONObject) hash.get(aVal.get(pid).toString());
                //如果记录的pid存在,则说明它有父节点,将她添加到孩子节点的集合中
                if(hashVP!=null){
                    //检查是否有child属性
                    if(hashVP.get(child)!=null){
                        JSONArray ch = (JSONArray) hashVP.get(child);
                        ch.add(aVal);
                        hashVP.put(child, ch);
                    }else{
                        JSONArray ch = new JSONArray();
                        ch.add(aVal);
                        hashVP.put(child, ch);
                    }
                }else{
                    r.add(aVal);
                }
            }
            return r;
        }
    

    使用方法

        List<Map<String,Object>> data = new ArrayList<>();
        Map<String,Object> map = new HashMap<>();
            map.put("id",1);
            map.put("pid",0);
            map.put("name","甘肃省");
            data.add(map);
        Map<String,Object> map2 = new HashMap<>();
            map2.put("id",2);
            map2.put("pid",1);
            map2.put("name","天水市");
            data.add(map2);
        Map<String,Object> map3 = new HashMap<>();
            map3.put("id",3);
            map3.put("pid",2);
            map3.put("name","秦州区");
            data.add(map3);
        Map<String,Object> map4 = new HashMap<>();
            map4.put("id",4);
            map4.put("pid",0);
            map4.put("name","北京市");
            data.add(map4);
        Map<String,Object> map5 = new HashMap<>();
            map5.put("id",5);
            map5.put("pid",4);
            map5.put("name","昌平区");
            data.add(map5);
    //////////////////////////////////////////////////////////////唯一id:id,父节点ID:pid,第三个是生成的子节点的名字随便写
    //父节点ID在数据库中不能为null可以为‘’
        JSONArray result = CopyUtils.listToTree(JSONArray.parseArray(JSON.toJSONString(data)),"id","pid","aefsedfv");
    

    结果集

    原始数据

    [
        {
            "name":"甘肃省",
            "pid":0,
            "id":1
        },
        {
            "name":"天水市",
            "pid":1,
            "id":2
        },
        {
            "name":"秦州区",
            "pid":2,
            "id":3
        },
        {
            "name":"北京市",
            "pid":0,
            "id":4
        },
        {
            "name":"昌平区",
            "pid":4,
            "id":5
        }
    ]
    

    结果集

    [
        {
            "children":[
                {
                    "children":[
                        {
                            "name":"秦州区",
                            "pid":2,
                            "id":3
                        }
                    ],
                    "name":"天水市",
                    "pid":1,
                    "id":2
                }
            ],
            "name":"甘肃省",
            "pid":0,
            "id":1
        },
        {
            "children":[
                {
                    "name":"昌平区",
                    "pid":4,
                    "id":5
                }
            ],
            "name":"北京市",
            "pid":0,
            "id":4
        }
    ]
    

    相关文章

      网友评论

          本文标题:将一个List.map根据父节点ID转成树状结构

          本文链接:https://www.haomeiwen.com/subject/gxaewhtx.html