java將list轉為樹形結構的方法


原始數據如下
[
    {
        "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
    }
]
現需要是使用java將以上數據轉為樹形結構,轉化后下的結構如下
[
    {
        "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
    }
]
代碼如下
/**
 * 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);
      //在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;
}
測試代碼如下
public static void main(String[] args){
   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);
   System.out.println(JSON.toJSONString(data));
   JSONArray result = listToTree(JSONArray.parseArray(JSON.toJSONString(data)),"id","pid","children");
   System.out.println(JSON.toJSONString(result));
}

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM