將一個List.map根據(jù)父節(jié)點ID轉(zhuǎn)成樹狀結(jié)構(gòu)

工具類

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
/**

     - Map listToTree
     - <p>方法說明<p>
     - 將JSONArray數(shù)組轉(zhuǎn)為樹狀結(jié)構(gòu)
     - @param arr 需要轉(zhuǎn)化的數(shù)據(jù)
     - @param id 數(shù)據(jù)唯一的標(biāo)識鍵值
     - @param pid 父id唯一標(biāo)識鍵值
     - @param child 子節(jié)點鍵值
     - @return JSONArray
     */
    public static JSONArray listToTree(JSONArray arr, String id, String pid, String child){
        JSONArray r = new JSONArray();
        JSONObject hash = new JSONObject();
        //將數(shù)組轉(zhuǎn)為Object的形式,key為數(shù)組中的id
        for(int i=0;i<arr.size();i++){
            JSONObject json = (JSONObject) arr.get(i);
            hash.put(json.getString(id), json);
        }
        //遍歷結(jié)果集
        for(int j=0;j<arr.size();j++){
            //單條記錄
            JSONObject aVal = (JSONObject) arr.get(j);
                        //解決key為空的問題(數(shù)據(jù)庫中父節(jié)點列為空)
            //判斷JSONObject是否存在這個key值
            if(!aVal.containsKey(pid)){
                aVal.put(pid,"000");
            }
            //在hash中取出key為單條記錄中pid的值
            JSONObject hashVP = (JSONObject) hash.get(aVal.get(pid).toString());
            //如果記錄的pid存在身坐,則說明它有父節(jié)點茵乱,將她添加到孩子節(jié)點的集合中
            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","秦州區(qū)");
        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","昌平區(qū)");
        data.add(map5);
//////////////////////////////////////////////////////////////唯一id:id,父節(jié)點ID:pid则北,第三個是生成的子節(jié)點的名字隨便寫
//父節(jié)點ID在數(shù)據(jù)庫中不能為null可以為‘’
    JSONArray result = CopyUtils.listToTree(JSONArray.parseArray(JSON.toJSONString(data)),"id","pid","aefsedfv");

結(jié)果集

原始數(shù)據(jù)

[
    {
        "name":"甘肅省",
        "pid":0,
        "id":1
    },
    {
        "name":"天水市",
        "pid":1,
        "id":2
    },
    {
        "name":"秦州區(qū)",
        "pid":2,
        "id":3
    },
    {
        "name":"北京市",
        "pid":0,
        "id":4
    },
    {
        "name":"昌平區(qū)",
        "pid":4,
        "id":5
    }
]

結(jié)果集

[
    {
        "children":[
            {
                "children":[
                    {
                        "name":"秦州區(qū)",
                        "pid":2,
                        "id":3
                    }
                ],
                "name":"天水市",
                "pid":1,
                "id":2
            }
        ],
        "name":"甘肅省",
        "pid":0,
        "id":1
    },
    {
        "children":[
            {
                "name":"昌平區(qū)",
                "pid":4,
                "id":5
            }
        ],
        "name":"北京市",
        "pid":0,
        "id":4
    }
]
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子辈毯,更是在濱河造成了極大的恐慌,老刑警劉巖搜贤,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谆沃,死亡現(xiàn)場離奇詭異,居然都是意外死亡仪芒,警方通過查閱死者的電腦和手機唁影,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來掂名,“玉大人据沈,你說我怎么就攤上這事〗让铮” “怎么了锌介?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我孔祸,道長隆敢,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任崔慧,我火速辦了婚禮拂蝎,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘惶室。我一直安慰自己温自,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布拇涤。 她就那樣靜靜地躺著捣作,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鹅士。 梳的紋絲不亂的頭發(fā)上券躁,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天,我揣著相機與錄音掉盅,去河邊找鬼也拜。 笑死,一個胖子當(dāng)著我的面吹牛趾痘,可吹牛的內(nèi)容都是我干的慢哈。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼永票,長吁一口氣:“原來是場噩夢啊……” “哼卵贱!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起侣集,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤键俱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后世分,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體编振,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年臭埋,在試婚紗的時候發(fā)現(xiàn)自己被綠了踪央。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡瓢阴,死狀恐怖畅蹂,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情荣恐,我是刑警寧澤液斜,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響旗唁,放射性物質(zhì)發(fā)生泄漏畦浓。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一检疫、第九天 我趴在偏房一處隱蔽的房頂上張望讶请。 院中可真熱鬧,春花似錦屎媳、人聲如沸夺溢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽风响。三九已至,卻和暖如春丹禀,著一層夾襖步出監(jiān)牢的瞬間状勤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工双泪, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留持搜,地道東北人。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓焙矛,卻偏偏與公主長得像葫盼,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子村斟,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容