天天看點

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));
}