本文展示了兩個實現方法的代碼。兩個代碼的實現方法不同,代碼2更為簡單。
先看一下最后實現的結果:

代碼1:
實現過程:
1.傳入一段json字符串
2.將字符串轉換成對象存入節點列表
3.根據節點列表構造無序的多叉樹,並將個孩子節點加入對應的父節點中,將無對應父節點的節點加入一級節點列表
4.排序
代碼:
1 package com.example.rabbitmq2; 2 3 4 5 import com.alibaba.fastjson.JSON; 6 import com.alibaba.fastjson.JSONArray; 7 import com.alibaba.fastjson.JSONObject; 8 9 import java.util.*; 10 11 public class MultipleTree { 12 public static void main(String[] args) { 13 14 /** 15 * 讀取層次數據結果集列表 16 */ 17 String strJson ="[\n" +"" + 18 " {\n" + 19 " \"id\":50090113,\n" + 20 " \"parentId\":50000001,\n" + 21 " \"name\":\"應用技術研發二中心\",\n" + 22 " \"status\":0, \n" + 23 " \"fullName\":\"應用技術研發二中心\"\n" + 24 " },\n" + 25 " {\n" + 26 " \"id\":50090193,\n" + 27 " \"parentId\":50000000,\n" + 28 " \"name\":\"應用技術研發一中心\",\n" + 29 " \"status\":0, \n" + 30 " \"fullName\":\"應用技術研發一中心\"\n" + 31 " },\n" + 32 " {\n" + 33 " \"id\":50090194,\n" + 34 " \"parentId\":50090193,\n" + 35 " \"name\":\"前端研發部\",\n" + 36 " \"status\":0,\n" + 37 " \"fullName\":\"應用技術研發一中心/前端研發部\"\n" + 38 " },\n" + 39 " {\n" + 40 " \"id\":50005413,\n" + 41 " \"parentId\":50090194,\n" + 42 " \"name\":\"安全網關產品前端研發組\",\n" + 43 " \"status\":1,\n" + 44 " \"fullName\":\"應用技術研發中心/前端研發部/安全網關產品前端研發組\"\n" + 45 " },\n" + 46 " {\n" + 47 " \"id\":50005415,\n" + 48 " \"parentId\":50090194,\n" + 49 " \"name\":\"前端研發二組\",\n" + 50 " \"status\":1,\n" + 51 " \"fullName\":\"應用技術研發中心/前端研發部/前端研發二組\"\n" + 52 " },\n" + 53 " {\n" + 54 " \"id\":50090199,\n" + 55 " \"parentId\":50090194,\n" + 56 " \"name\":\"雲安全前端研發組\",\n" + 57 " \"status\":1,\n" + 58 " \"fullName\":\"應用技術研發中心/前端研發部/雲安全前端研發組\"\n" + 59 " },\n" + 60 " {\n" + 61 " \"id\":50090200,\n" + 62 " \"parentId\":50090194,\n" + 63 " \"name\":\"威脅情報前端研發組\",\n" + 64 " \"status\":1,\n" + 65 " \"fullName\":\"應用技術研發中心/前端研發部/威脅情報前端研發組\"\n" + 66 " },\n" + 67 " {\n" + 68 " \"id\":50090201,\n" + 69 " \"parentId\":50090194,\n" + 70 " \"name\":\"大數據與安全運營前端產品組\",\n" + 71 " \"status\":1,\n" + 72 " \"fullName\":\"應用技術研發中心/前端研發部/大數據與安全運營前端產品組\"\n" + 73 " \n" + 74 " },\n" + 75 " {\n" + 76 " \"id\":50090202,\n" + 77 " \"parentId\":50090194,\n" + 78 " \"name\":\"大數據與安全運營前端架構組\",\n" + 79 " \"status\":1,\n" + 80 " \"fullName\":\"應用技術研發中心/前端研發部/大數據與安全運營前端架構組\"\n" + 81 " \n" + 82 " },\n" + 83 " {\n" + 84 " \"id\":50090203,\n" + 85 " \"parentId\":50090194,\n" + 86 " \"name\":\"大數據與安全運營前端研發二組\",\n" + 87 " \"status\":1,\n" + 88 " \n" + 89 " \"fullName\":\"應用技術研發中心/前端研發部/大數據與安全運營前端研發二組\"\n" + 90 " },\n" + 91 " {\n" + 92 " \"id\":50090204,\n" + 93 " \"parentId\":50090194,\n" + 94 " \"name\":\"大數據與安全運營前端研發三組\",\n" + 95 " \"status\":1,\n" + 96 " \"fullName\":\"應用技術研發中心/前端研發部/大數據與安全運營前端研發三組\"\n" + 97 "\n" + 98 " },\n" + 99 " {\n" + 100 " \"id\":50090205,\n" + 101 " \"parentId\":50090194,\n" + 102 " \"name\":\"大數據與安全運營前端研發四組\",\n" + 103 " \"status\":1,\n" + 104 " \n" + 105 " \"fullName\":\"應用技術研發中心/前端研發部/大數據與安全運營前端研發四組\"\n" + 106 "\n" + 107 " },\n" + 108 " {\n" + 109 " \"id\":50090206,\n" + 110 " \"parentId\":50090194,\n" + 111 " \"name\":\"大數據與安全運營前端研發運營商部\",\n" + 112 " \"status\":1,\n" + 113 " \n" + 114 " \"fullName\":\"應用技術研發中心/前端研發部/大數據與安全運營前端研發運營商部\"\n" + 115 "\n" + 116 " },\n" + 117 " {\n" + 118 " \"id\":50090207,\n" + 119 " \"parentId\":50090194,\n" + 120 " \"name\":\"大數據與安全運營前端研發政企部\",\n" + 121 " \"status\":1, \n" + 122 " \"fullName\":\"應用技術研發中心/前端研發部/大數據與安全運營前端研發政企部\"\n" + 123 " },\n" + 124 " {\n" + 125 " \"id\":50090208,\n" + 126 " \"parentId\":50090194,\n" + 127 " \"name\":\"態勢感知前端研發組\",\n" + 128 " \"status\":1,\n" + 129 " \"fullName\":\"應用技術研發中心/前端研發部/態勢感知前端研發組\"\n" + 130 " },\n" + 131 " {\n" + 132 " \"id\":50090209,\n" + 133 " \"parentId\":50090194,\n" + 134 " \"name\":\"大數據應用前端研發組\",\n" + 135 " \"status\":1,\n" + 136 " \"fullName\":\"應用技術研發中心/前端研發部/大數據應用前端研發組\"\n" + 137 " },\n" + 138 " {\n" + 139 " \"id\":50090210,\n" + 140 " \"parentId\":50090194,\n" + 141 " \"name\":\"大數據與威脅分析前端研發一組\",\n" + 142 " \"status\":1,\n" + 143 " \"fullName\":\"應用技術研發中心/前端研發部/大數據與威脅分析前端研發一組\"\n" + 144 " },\n" + 145 " {\n" + 146 " \"id\":50090211,\n" + 147 " \"parentId\":50090194,\n" + 148 " \"name\":\"大數據與威脅公司前端研發二組\",\n" + 149 " \"status\":1,\n" + 150 " \"fullName\":\"應用技術研發中心/前端研發部/大數據與威脅公司前端研發二組\"\n" + 151 " },\n" + 152 " {\n" + 153 " \"id\":50090212,\n" + 154 " \"parentId\":50090194,\n" + 155 " \"name\":\"大數據與威脅分析前端研發三組\",\n" + 156 " \"status\":1,\n" + 157 " \"fullName\":\"應用技術研發中心/前端研發部/大數據與威脅分析前端研發三組\"\n" + 158 " },\n" + 159 " {\n" + 160 " \"id\":50090213,\n" + 161 " \"parentId\":50090194,\n" + 162 " \"name\":\"工業安全前端研發組\",\n" + 163 " \"status\":1,\n" + 164 " \"fullName\":\"應用技術研發中心/前端研發部/工業安全前端研發組\"\n" + 165 " },\n" + 166 " {\n" + 167 " \"id\":50090214,\n" + 168 " \"parentId\":50090194,\n" + 169 " \"name\":\"行為安全前端研發組\",\n" + 170 " \"status\":1,\n" + 171 " \"fullName\":\"應用技術研發中心/前端研發部/行為安全前端研發組\"\n" + 172 " },\n" + 173 " {\n" + 174 " \"id\":50090215,\n" + 175 " \"parentId\":50090194,\n" + 176 " \"name\":\"基礎大數據前端研發組\",\n" + 177 " \"status\":1,\n" + 178 " \"fullName\":\"應用技術研發中心/前端研發部/基礎大數據前端研發組\"\n" + 179 " },\n" + 180 " {\n" + 181 " \"id\":50090216,\n" + 182 " \"parentId\":50090194,\n" + 183 " \"name\":\"應用產品前端研發組\",\n" + 184 " \"status\":1,\n" + 185 " \"fullName\":\"應用技術研發中心/前端研發部/應用產品前端研發組\"\n" + 186 " },\n" + 187 " {\n" + 188 " \"id\":50090217,\n" + 189 " \"parentId\":50090194,\n" + 190 " \"name\":\"終端安全產品前端研發組\",\n" + 191 " \"status\":0,\n" + 192 " \"fullName\":\"應用技術研發一中心/前端研發部/終端安全產品前端研發組\"\n" + 193 " },\n" + 194 " {\n" + 195 " \"id\":50090218,\n" + 196 " \"parentId\":50090194,\n" + 197 " \"name\":\"安全產品前端研發組\",\n" + 198 " \"status\":1,\n" + 199 " \"fullName\":\"應用技術研發中心/前端研發部/安全產品前端研發組\"\n" + 200 " },\n" + 201 " {\n" + 202 " \"id\":50090219,\n" + 203 " \"parentId\":50090194,\n" + 204 " \"name\":\"數據安全前端研發組\",\n" + 205 " \"status\":0,\n" + 206 " \"fullName\":\"應用技術研發一中心/前端研發部/數據安全前端研發組\"\n" + 207 " },\n" + 208 " {\n" + 209 " \"id\":50090220,\n" + 210 " \"parentId\":50090194,\n" + 211 " \"name\":\"運維前端研發組\",\n" + 212 " \"status\":1,\n" + 213 " \"fullName\":\"應用技術研發中心/前端研發部/運維前端研發組\"\n" + 214 " },\n" + 215 " {\n" + 216 " \"id\":50090221,\n" + 217 " \"parentId\":50090194,\n" + 218 " \"name\":\"華南基地前端研發組\",\n" + 219 " \"status\":1,\n" + 220 " \"fullName\":\"應用技術研發中心/前端研發部/華南基地前端研發組\"\n" + 221 " },\n" + 222 " {\n" + 223 " \"id\":50090222,\n" + 224 " \"parentId\":50090194,\n" + 225 " \"name\":\"補天產品前端研發部\",\n" + 226 " \"status\":1,\n" + 227 " \"fullName\":\"應用技術研發中心/前端研發部/補天產品前端研發部\"\n" + 228 " },\n" + 229 " {\n" + 230 " \"id\":50090789,\n" + 231 " \"parentId\":50090194,\n" + 232 " \"name\":\"前端一部\",\n" + 233 " \"status\":0,\n" + 234 " \"fullName\":\"應用技術研發一中心/前端研發部/前端一部\"\n" + 235 " },\n" + 236 " {\n" + 237 " \"id\":50090790,\n" + 238 " \"parentId\":50090789,\n" + 239 " \"name\":\"前端一組\",\n" + 240 " \"status\":0,\n" + 241 " \"fullName\":\"應用技術研發一中心/前端研發部/前端一部/前端一組\"\n" + 242 " },\n" + 243 " {\n" + 244 " \"id\":50090795,\n" + 245 " \"parentId\":50090789,\n" + 246 " \"name\":\"前端三組\",\n" + 247 " \"status\":0,\n" + 248 " \"fullName\":\"應用技術研發一中心/前端研發部/前端一部/前端三組\"\n" + 249 " },\n" + 250 " {\n" + 251 " \"id\":50090797,\n" + 252 " \"parentId\":50090789,\n" + 253 " \"name\":\"珠海組\",\n" + 254 " \"status\":0,\n" + 255 " \"fullName\":\"應用技術研發一中心/前端研發部/前端一部/珠海組\"\n" + 256 " },\n" + 257 " {\n" + 258 " \"id\":50091815,\n" + 259 " \"parentId\":50090789,\n" + 260 " \"name\":\"西安組\",\n" + 261 " \"status\":0,\n" + 262 " \"fullName\":\"應用技術研發一中心/前端研發部/前端一部/西安組\"\n" + 263 " },\n" + 264 " {\n" + 265 " \"id\":50090793,\n" + 266 " \"parentId\":50090194,\n" + 267 " \"name\":\"前端二部\",\n" + 268 " \"status\":0,\n" + 269 " \"fullName\":\"應用技術研發一中心/前端研發部/前端二部\"\n" + 270 " },\n" + 271 " {\n" + 272 " \"id\":50090791,\n" + 273 " \"parentId\":50090793,\n" + 274 " \"name\":\"前端四組\",\n" + 275 " \"status\":0,\n" + 276 " \"fullName\":\"應用技術研發一中心/前端研發部/前端二部/前端四組\"\n" + 277 " },\n" + 278 " {\n" + 279 " \"id\":50090794,\n" + 280 " \"parentId\":50090793,\n" + 281 " \"name\":\"前端二組\",\n" + 282 " \"status\":0,\n" + 283 "\n" + 284 " \"fullName\":\"應用技術研發一中心/前端研發部/前端二部/前端二組\"\n" + 285 " },\n" + 286 " {\n" + 287 " \"id\":50091816,\n" + 288 " \"parentId\":50090793,\n" + 289 " \"name\":\"上海組\",\n" + 290 " \"status\":0,\n" + 291 " \"fullName\":\"應用技術研發一中心/前端研發部/前端二部/上海組\"\n" + 292 " },\n" + 293 " {\n" + 294 " \"id\":50090798,\n" + 295 " \"parentId\":50090194,\n" + 296 " \"name\":\"共性技術組\",\n" + 297 " \"status\":0,\n" + 298 " \"fullName\":\"應用技術研發一中心/前端研發部/共性技術組\"\n" + 299 " },\n" + 300 " {\n" + 301 " \"id\":50091814,\n" + 302 " \"parentId\":50090194,\n" + 303 " \"name\":\"前端三部\",\n" + 304 " \"status\":0,\n" + 305 " \"fullName\":\"應用技術研發一中心/前端研發部/前端三部\"\n" + 306 " },\n" + 307 " {\n" + 308 " \"id\":50090792,\n" + 309 " \"parentId\":50091814,\n" + 310 " \"name\":\"前端六組\",\n" + 311 " \"status\":0,\n" + 312 " \"fullName\":\"應用技術研發一中心/前端研發部/前端三部/前端六組\"\n" + 313 " },\n" + 314 " {\n" + 315 " \"id\":50090796,\n" + 316 " \"parentId\":50091814,\n" + 317 " \"name\":\"前端七組\",\n" + 318 " \"status\":0,\n" + 319 " \"fullName\":\"應用技術研發一中心/前端研發部/前端三部/前端七組\"\n" + 320 " },\n" + 321 " {\n" + 322 " \"id\":50091817,\n" + 323 " \"parentId\":50091814,\n" + 324 " \"name\":\"前端八組\",\n" + 325 " \"status\":0,\n" + 326 " \"fullName\":\"應用技術研發一中心/前端研發部/前端三部/前端八組\"\n" + 327 " },\n" + 328 " {\n" + 329 " \"id\":50091818,\n" + 330 " \"parentId\":50091814,\n" + 331 " \"name\":\"前端九組\",\n" + 332 " \"status\":0,\n" + 333 " \"fullName\":\"應用技術研發一中心/前端研發部/前端三部/前端九組\"\n" + 334 " },\n" + 335 " {\n" + 336 " \"id\":50090195,\n" + 337 " \"parentId\":50090193,\n" + 338 " \"name\":\"研發一部\",\n" + 339 " \"status\":0,\n" + 340 " \"fullName\":\"應用技術研發一中心/研發一部\"\n" + 341 " },\n" + 342 " {\n" + 343 " \"id\":50090620,\n" + 344 " \"parentId\":50090195,\n" + 345 " \"name\":\"策略管理組\",\n" + 346 " \"status\":0,\n" + 347 " \"fullName\":\"應用技術研發一中心/研發一部/策略管理組\"\n" + 348 " },\n" + 349 " {\n" + 350 " \"id\":50090621,\n" + 351 " \"parentId\":50090195,\n" + 352 " \"name\":\"集中管理組\",\n" + 353 " \"status\":0,\n" + 354 " \"fullName\":\"應用技術研發一中心/研發一部/集中管理組\"\n" + 355 " },\n" + 356 " {\n" + 357 " \"id\":50090622,\n" + 358 " \"parentId\":50090195,\n" + 359 " \"name\":\"產品規划與設計組\",\n" + 360 " \"status\":0,\n" + 361 " \"fullName\":\"應用技術研發一中心/研發一部/產品規划與設計組\"\n" + 362 " },\n" + 363 " {\n" + 364 " \"id\":50090632,\n" + 365 " \"parentId\":50090195,\n" + 366 " \"name\":\"研發管理組\",\n" + 367 " \"status\":0,\n" + 368 " \"fullName\":\"應用技術研發一中心/研發一部/研發管理組\"\n" + 369 " },\n" + 370 " {\n" + 371 " \"id\":50091022,\n" + 372 " \"parentId\":50090195,\n" + 373 " \"name\":\"解決方案組\",\n" + 374 " \"status\":0,\n" + 375 " \"fullName\":\"應用技術研發一中心/研發一部/解決方案組\"\n" + 376 " },\n" + 377 " {\n" + 378 " \"id\":50091023,\n" + 379 " \"parentId\":50090195,\n" + 380 " \"name\":\"公共服務組\",\n" + 381 " \"status\":0,\n" + 382 " \"fullName\":\"應用技術研發一中心/研發一部/公共服務組\"\n" + 383 "\n" + 384 " },\n" + 385 " {\n" + 386 " \"id\":50091024,\n" + 387 " \"parentId\":50090195,\n" + 388 " \"name\":\"網絡拓普組\",\n" + 389 " \"status\":0,\n" + 390 " \"fullName\":\"應用技術研發一中心/研發一部/網絡拓普組\"\n" + 391 " },\n" + 392 " {\n" + 393 " \"id\":50090197,\n" + 394 " \"parentId\":50090193,\n" + 395 " \"name\":\"研發三部\",\n" + 396 " \"status\":0,\n" + 397 " \"fullName\":\"應用技術研發一中心/研發三部\"\n" + 398 " },\n" + 399 " {\n" + 400 " \"id\":50090232,\n" + 401 " \"parentId\":50090197,\n" + 402 " \"name\":\"工業安全服務端研發組\",\n" + 403 " \"status\":0,\n" + 404 " \"fullName\":\"應用技術研發一中心/研發三部/工業安全服務端研發組\"\n" + 405 " },\n" + 406 " {\n" + 407 " \"id\":50090631,\n" + 408 " \"parentId\":50090193,\n" + 409 " \"name\":\"設計與研發支撐部\",\n" + 410 " \"status\":0,\n" + 411 " \"fullName\":\"應用技術研發一中心/設計與研發支撐部\"\n" + 412 " },\n" + 413 " {\n" + 414 " \"id\":50090633,\n" + 415 " \"parentId\":50090193,\n" + 416 " \"name\":\"UED\",\n" + 417 " \"status\":0,\n" + 418 " \"fullName\":\"應用技術研發一中心/UED\"\n" + 419 " },\n" + 420 " {\n" + 421 " \"id\":50090799,\n" + 422 " \"parentId\":50090193,\n" + 423 " \"name\":\"武漢研發部\",\n" + 424 " \"status\":0,\n" + 425 " \"fullName\":\"應用技術研發一中心/武漢研發部\"\n" + 426 " },\n" + 427 " {\n" + 428 " \"id\":50090800,\n" + 429 " \"parentId\":50090799,\n" + 430 " \"name\":\"武漢前端一組\",\n" + 431 " \"status\":0,\n" + 432 " \"fullName\":\"應用技術研發一中心/武漢研發部/武漢前端一組\"\n" + 433 " },\n" + 434 " {\n" + 435 " \"id\":50090801,\n" + 436 " \"parentId\":50090799,\n" + 437 " \"name\":\"武漢前端二組\",\n" + 438 " \"status\":0,\n" + 439 " \"fullName\":\"應用技術研發一中心/武漢研發部/武漢前端二組\"\n" + 440 " }]\n"; 441 //字符串轉換JSON數組 442 JSONArray jsonArray = JSONArray.parseArray(strJson); 443 //節點列表(散列表,用於臨時存儲節點對象) 444 HashMap nodeList = new HashMap(); 445 //最后結果節點列表 446 HashMap nodeResultList = new HashMap(); 447 //根節點 448 Node root = new Node(); 449 Node node =new Node(); 450 //設置根節點,id為0 451 nodeResultList.put(0, node); 452 453 //根據結果集構造節點列表(存入散列表) 454 for(int i=0;i<jsonArray.size();i++){ 455 Node node1 = JSONObject.parseObject(jsonArray.get(i).toString(),Node.class); 456 nodeList.put(node1.id, node1); 457 } 458 459 //構造無序的多叉樹 //entrySet() 該方法返回值是這個map中各個鍵值對映射關系的集合 460 Set entrySet = nodeList.entrySet(); 461 //value=entrySet.iterator().next().getValue() key=entrySet.iterator().next().getKey() 462 for (Iterator it = entrySet.iterator(); it.hasNext();) { 463 node = (Node) ((Map.Entry) it.next()).getValue(); 464 int i= 1; 465 //如果parentId有對應的id,則作為孩子節點加入對應的父節點中 466 for (Iterator it2 = entrySet.iterator(); it2.hasNext();) { 467 Node node2 = (Node) ((Map.Entry) it2.next()).getValue(); 468 if (node.parentId == node2.id) { 469 ((Node) nodeList.get(node.parentId)).addChild(node); 470 System.out.println(node.parentId); 471 i++; 472 break; 473 } 474 } 475 //若parentId都無對應的id,則為一級節點,加入根節點中 476 if(i==1){ 477 ((Node) nodeResultList.get(0)).addChild(node); 478 } 479 } 480 481 root = (Node) nodeResultList.get(0); 482 // 輸出無序的樹形菜單的JSON字符串 483 System.out.println(JSON.toJSONString(root)); 484 // 對多叉樹進行橫向排序 485 root.sortChildren(); 486 487 // 輸出有序的樹形菜單的JSON字符串 488 //重寫的toString方法的結果,(可使最后結果根據自己想要展示的樣子展示) 489 System.out.println("------------------root.toString()"+root.toString()); 490 //未重寫toString方法的結果 491 System.out.println("------------------JSON.toJSONString(root)"+JSON.toJSONString(root)); 492 493 } 494 }
1 package com.example.rabbitmq2; 2 3 import com.alibaba.fastjson.JSONObject; 4 import lombok.Data; 5 import lombok.Getter; 6 import lombok.Setter; 7 8 import java.util.ArrayList; 9 import java.util.Collections; 10 import java.util.Iterator; 11 import java.util.List; 12 13 @Data 14 public class Node { 15 /** 16 * 節點編號 17 */ 18 public int id; 19 /** 20 * 父節點編號 21 */ 22 public int parentId; 23 /** 24 * 節點名稱 25 */ 26 public String name; 27 /** 28 * 節點狀態 29 */ 30 public int status; 31 /** 32 * 節點全稱 33 */ 34 public String fullName; 35 36 /** 37 * 孩子節點列表 38 */ 39 private List childrenList = new ArrayList(); 40 41 // 先序遍歷,拼接JSON字符串 42 public String toString() { 43 String result = "{" 44 + "\"id\" : \"" + id + "\"" 45 + ", \"fullName\" : \"" + fullName + "\"" 46 + ", \"name\" : \"" + name + "\"" 47 + ", \"status\" : \"" + status + "\""; 48 49 if (childrenList != null && childrenList.size() != 0) { 50 result += ", \"children\" : " + childrenList.toString(); 51 } 52 return result + "}"; 53 } 54 55 // 兄弟節點橫向排序 56 public void sortChildren() { 57 if (childrenList != null && childrenList.size() != 0) { 58 // 對本層節點進行排序 59 // 可根據不同的排序屬性,傳入不同的比較器,這里傳入ID比較器 60 Collections.sort(childrenList, new NodeIDComparator()); 61 // 對每個節點的下一層節點進行排序 62 for (Iterator it = childrenList.iterator(); it.hasNext();) { 63 ((Node) it.next()).sortChildren(); 64 } 65 } 66 } 67 // 添加孩子節點 68 public void addChild(Node node) { 69 childrenList.add(node); 70 71 } 72 }
1 package com.example.rabbitmq2; 2 3 import java.util.Comparator; 4 5 /** 6 * 節點比較器 7 */ 8 class NodeIDComparator implements Comparator { 9 // 按照節點編號比較 10 public int compare(Object o1, Object o2) { 11 int j1 = ((Node) o1).id; 12 int j2 = ((Node) o2).id; 13 return (j1 < j2 ? -1 : (j1 == j2 ? 0 : 1)); 14 } 15 }
代碼2:
實現過程:
1.將傳入的json字符串轉為List
2.找的所有的一級節點存入結果list中
3.使用遞歸,為所有的節點設置子節點
代碼
1 package com.example.rabbitmq2; 2 3 import com.alibaba.fastjson.JSON; 4 import com.alibaba.fastjson.JSONArray; 5 import com.alibaba.fastjson.JSONObject; 6 import org.junit.platform.commons.util.StringUtils; 7 8 import java.util.ArrayList; 9 import java.util.HashMap; 10 import java.util.List; 11 import java.util.Map; 12 13 public class MultipleTree3 { 14 public static void main(String[] args) { 15 // 原始的數據 16 /** 17 * 讀取層次數據結果集列表 18 */ 19 String strJson ="[\n" +"" + 20 " {\n" + 21 " \"id\":50090113,\n" + 22 " \"parentId\":50000001,\n" + 23 " \"name\":\"應用技術研發二中心\",\n" + 24 " \"status\":0, \n" + 25 " \"fullName\":\"應用技術研發二中心\"\n" + 26 " },\n" + 27 " {\n" + 28 " \"id\":50090193,\n" + 29 " \"parentId\":50000000,\n" + 30 " \"name\":\"應用技術研發一中心\",\n" + 31 " \"status\":0, \n" + 32 " \"fullName\":\"應用技術研發一中心\"\n" + 33 " },\n" + 34 " {\n" + 35 " \"id\":50090194,\n" + 36 " \"parentId\":50090193,\n" + 37 " \"name\":\"前端研發部\",\n" + 38 " \"status\":0,\n" + 39 " \"fullName\":\"應用技術研發一中心/前端研發部\"\n" + 40 " },\n" + 41 " {\n" + 42 " \"id\":50005413,\n" + 43 " \"parentId\":50090194,\n" + 44 " \"name\":\"安全網關產品前端研發組\",\n" + 45 " \"status\":1,\n" + 46 " \"fullName\":\"應用技術研發中心/前端研發部/安全網關產品前端研發組\"\n" + 47 " },\n" + 48 " {\n" + 49 " \"id\":50005415,\n" + 50 " \"parentId\":50090194,\n" + 51 " \"name\":\"前端研發二組\",\n" + 52 " \"status\":1,\n" + 53 " \"fullName\":\"應用技術研發中心/前端研發部/前端研發二組\"\n" + 54 " },\n" + 55 " {\n" + 56 " \"id\":50090199,\n" + 57 " \"parentId\":50090194,\n" + 58 " \"name\":\"雲安全前端研發組\",\n" + 59 " \"status\":1,\n" + 60 " \"fullName\":\"應用技術研發中心/前端研發部/雲安全前端研發組\"\n" + 61 " },\n" + 62 " {\n" + 63 " \"id\":50090200,\n" + 64 " \"parentId\":50090194,\n" + 65 " \"name\":\"威脅情報前端研發組\",\n" + 66 " \"status\":1,\n" + 67 " \"fullName\":\"應用技術研發中心/前端研發部/威脅情報前端研發組\"\n" + 68 " },\n" + 69 " {\n" + 70 " \"id\":50090201,\n" + 71 " \"parentId\":50090194,\n" + 72 " \"name\":\"大數據與安全運營前端產品組\",\n" + 73 " \"status\":1,\n" + 74 " \"fullName\":\"應用技術研發中心/前端研發部/大數據與安全運營前端產品組\"\n" + 75 " \n" + 76 " },\n" + 77 " {\n" + 78 " \"id\":50090202,\n" + 79 " \"parentId\":50090194,\n" + 80 " \"name\":\"大數據與安全運營前端架構組\",\n" + 81 " \"status\":1,\n" + 82 " \"fullName\":\"應用技術研發中心/前端研發部/大數據與安全運營前端架構組\"\n" + 83 " \n" + 84 " },\n" + 85 " {\n" + 86 " \"id\":50090203,\n" + 87 " \"parentId\":50090194,\n" + 88 " \"name\":\"大數據與安全運營前端研發二組\",\n" + 89 " \"status\":1,\n" + 90 " \n" + 91 " \"fullName\":\"應用技術研發中心/前端研發部/大數據與安全運營前端研發二組\"\n" + 92 " },\n" + 93 " {\n" + 94 " \"id\":50090204,\n" + 95 " \"parentId\":50090194,\n" + 96 " \"name\":\"大數據與安全運營前端研發三組\",\n" + 97 " \"status\":1,\n" + 98 " \"fullName\":\"應用技術研發中心/前端研發部/大數據與安全運營前端研發三組\"\n" + 99 "\n" + 100 " },\n" + 101 " {\n" + 102 " \"id\":50090205,\n" + 103 " \"parentId\":50090194,\n" + 104 " \"name\":\"大數據與安全運營前端研發四組\",\n" + 105 " \"status\":1,\n" + 106 " \n" + 107 " \"fullName\":\"應用技術研發中心/前端研發部/大數據與安全運營前端研發四組\"\n" + 108 "\n" + 109 " },\n" + 110 " {\n" + 111 " \"id\":50090206,\n" + 112 " \"parentId\":50090194,\n" + 113 " \"name\":\"大數據與安全運營前端研發運營商部\",\n" + 114 " \"status\":1,\n" + 115 " \n" + 116 " \"fullName\":\"應用技術研發中心/前端研發部/大數據與安全運營前端研發運營商部\"\n" + 117 "\n" + 118 " },\n" + 119 " {\n" + 120 " \"id\":50090207,\n" + 121 " \"parentId\":50090194,\n" + 122 " \"name\":\"大數據與安全運營前端研發政企部\",\n" + 123 " \"status\":1, \n" + 124 " \"fullName\":\"應用技術研發中心/前端研發部/大數據與安全運營前端研發政企部\"\n" + 125 " },\n" + 126 " {\n" + 127 " \"id\":50090208,\n" + 128 " \"parentId\":50090194,\n" + 129 " \"name\":\"態勢感知前端研發組\",\n" + 130 " \"status\":1,\n" + 131 " \"fullName\":\"應用技術研發中心/前端研發部/態勢感知前端研發組\"\n" + 132 " },\n" + 133 " {\n" + 134 " \"id\":50090209,\n" + 135 " \"parentId\":50090194,\n" + 136 " \"name\":\"大數據應用前端研發組\",\n" + 137 " \"status\":1,\n" + 138 " \"fullName\":\"應用技術研發中心/前端研發部/大數據應用前端研發組\"\n" + 139 " },\n" + 140 " {\n" + 141 " \"id\":50090210,\n" + 142 " \"parentId\":50090194,\n" + 143 " \"name\":\"大數據與威脅分析前端研發一組\",\n" + 144 " \"status\":1,\n" + 145 " \"fullName\":\"應用技術研發中心/前端研發部/大數據與威脅分析前端研發一組\"\n" + 146 " },\n" + 147 " {\n" + 148 " \"id\":50090211,\n" + 149 " \"parentId\":50090194,\n" + 150 " \"name\":\"大數據與威脅公司前端研發二組\",\n" + 151 " \"status\":1,\n" + 152 " \"fullName\":\"應用技術研發中心/前端研發部/大數據與威脅公司前端研發二組\"\n" + 153 " },\n" + 154 " {\n" + 155 " \"id\":50090212,\n" + 156 " \"parentId\":50090194,\n" + 157 " \"name\":\"大數據與威脅分析前端研發三組\",\n" + 158 " \"status\":1,\n" + 159 " \"fullName\":\"應用技術研發中心/前端研發部/大數據與威脅分析前端研發三組\"\n" + 160 " },\n" + 161 " {\n" + 162 " \"id\":50090213,\n" + 163 " \"parentId\":50090194,\n" + 164 " \"name\":\"工業安全前端研發組\",\n" + 165 " \"status\":1,\n" + 166 " \"fullName\":\"應用技術研發中心/前端研發部/工業安全前端研發組\"\n" + 167 " },\n" + 168 " {\n" + 169 " \"id\":50090214,\n" + 170 " \"parentId\":50090194,\n" + 171 " \"name\":\"行為安全前端研發組\",\n" + 172 " \"status\":1,\n" + 173 " \"fullName\":\"應用技術研發中心/前端研發部/行為安全前端研發組\"\n" + 174 " },\n" + 175 " {\n" + 176 " \"id\":50090215,\n" + 177 " \"parentId\":50090194,\n" + 178 " \"name\":\"基礎大數據前端研發組\",\n" + 179 " \"status\":1,\n" + 180 " \"fullName\":\"應用技術研發中心/前端研發部/基礎大數據前端研發組\"\n" + 181 " },\n" + 182 " {\n" + 183 " \"id\":50090216,\n" + 184 " \"parentId\":50090194,\n" + 185 " \"name\":\"應用產品前端研發組\",\n" + 186 " \"status\":1,\n" + 187 " \"fullName\":\"應用技術研發中心/前端研發部/應用產品前端研發組\"\n" + 188 " },\n" + 189 " {\n" + 190 " \"id\":50090217,\n" + 191 " \"parentId\":50090194,\n" + 192 " \"name\":\"終端安全產品前端研發組\",\n" + 193 " \"status\":0,\n" + 194 " \"fullName\":\"應用技術研發一中心/前端研發部/終端安全產品前端研發組\"\n" + 195 " },\n" + 196 " {\n" + 197 " \"id\":50090218,\n" + 198 " \"parentId\":50090194,\n" + 199 " \"name\":\"安全產品前端研發組\",\n" + 200 " \"status\":1,\n" + 201 " \"fullName\":\"應用技術研發中心/前端研發部/安全產品前端研發組\"\n" + 202 " },\n" + 203 " {\n" + 204 " \"id\":50090219,\n" + 205 " \"parentId\":50090194,\n" + 206 " \"name\":\"數據安全前端研發組\",\n" + 207 " \"status\":0,\n" + 208 " \"fullName\":\"應用技術研發一中心/前端研發部/數據安全前端研發組\"\n" + 209 " },\n" + 210 " {\n" + 211 " \"id\":50090220,\n" + 212 " \"parentId\":50090194,\n" + 213 " \"name\":\"運維前端研發組\",\n" + 214 " \"status\":1,\n" + 215 " \"fullName\":\"應用技術研發中心/前端研發部/運維前端研發組\"\n" + 216 " },\n" + 217 " {\n" + 218 " \"id\":50090221,\n" + 219 " \"parentId\":50090194,\n" + 220 " \"name\":\"華南基地前端研發組\",\n" + 221 " \"status\":1,\n" + 222 " \"fullName\":\"應用技術研發中心/前端研發部/華南基地前端研發組\"\n" + 223 " },\n" + 224 " {\n" + 225 " \"id\":50090222,\n" + 226 " \"parentId\":50090194,\n" + 227 " \"name\":\"補天產品前端研發部\",\n" + 228 " \"status\":1,\n" + 229 " \"fullName\":\"應用技術研發中心/前端研發部/補天產品前端研發部\"\n" + 230 " },\n" + 231 " {\n" + 232 " \"id\":50090789,\n" + 233 " \"parentId\":50090194,\n" + 234 " \"name\":\"前端一部\",\n" + 235 " \"status\":0,\n" + 236 " \"fullName\":\"應用技術研發一中心/前端研發部/前端一部\"\n" + 237 " },\n" + 238 " {\n" + 239 " \"id\":50090790,\n" + 240 " \"parentId\":50090789,\n" + 241 " \"name\":\"前端一組\",\n" + 242 " \"status\":0,\n" + 243 " \"fullName\":\"應用技術研發一中心/前端研發部/前端一部/前端一組\"\n" + 244 " },\n" + 245 " {\n" + 246 " \"id\":50090795,\n" + 247 " \"parentId\":50090789,\n" + 248 " \"name\":\"前端三組\",\n" + 249 " \"status\":0,\n" + 250 " \"fullName\":\"應用技術研發一中心/前端研發部/前端一部/前端三組\"\n" + 251 " },\n" + 252 " {\n" + 253 " \"id\":50090797,\n" + 254 " \"parentId\":50090789,\n" + 255 " \"name\":\"珠海組\",\n" + 256 " \"status\":0,\n" + 257 " \"fullName\":\"應用技術研發一中心/前端研發部/前端一部/珠海組\"\n" + 258 " },\n" + 259 " {\n" + 260 " \"id\":50091815,\n" + 261 " \"parentId\":50090789,\n" + 262 " \"name\":\"西安組\",\n" + 263 " \"status\":0,\n" + 264 " \"fullName\":\"應用技術研發一中心/前端研發部/前端一部/西安組\"\n" + 265 " },\n" + 266 " {\n" + 267 " \"id\":50090793,\n" + 268 " \"parentId\":50090194,\n" + 269 " \"name\":\"前端二部\",\n" + 270 " \"status\":0,\n" + 271 " \"fullName\":\"應用技術研發一中心/前端研發部/前端二部\"\n" + 272 " },\n" + 273 " {\n" + 274 " \"id\":50090791,\n" + 275 " \"parentId\":50090793,\n" + 276 " \"name\":\"前端四組\",\n" + 277 " \"status\":0,\n" + 278 " \"fullName\":\"應用技術研發一中心/前端研發部/前端二部/前端四組\"\n" + 279 " },\n" + 280 " {\n" + 281 " \"id\":50090794,\n" + 282 " \"parentId\":50090793,\n" + 283 " \"name\":\"前端二組\",\n" + 284 " \"status\":0,\n" + 285 "\n" + 286 " \"fullName\":\"應用技術研發一中心/前端研發部/前端二部/前端二組\"\n" + 287 " },\n" + 288 " {\n" + 289 " \"id\":50091816,\n" + 290 " \"parentId\":50090793,\n" + 291 " \"name\":\"上海組\",\n" + 292 " \"status\":0,\n" + 293 " \"fullName\":\"應用技術研發一中心/前端研發部/前端二部/上海組\"\n" + 294 " },\n" + 295 " {\n" + 296 " \"id\":50090798,\n" + 297 " \"parentId\":50090194,\n" + 298 " \"name\":\"共性技術組\",\n" + 299 " \"status\":0,\n" + 300 " \"fullName\":\"應用技術研發一中心/前端研發部/共性技術組\"\n" + 301 " },\n" + 302 " {\n" + 303 " \"id\":50091814,\n" + 304 " \"parentId\":50090194,\n" + 305 " \"name\":\"前端三部\",\n" + 306 " \"status\":0,\n" + 307 " \"fullName\":\"應用技術研發一中心/前端研發部/前端三部\"\n" + 308 " },\n" + 309 " {\n" + 310 " \"id\":50090792,\n" + 311 " \"parentId\":50091814,\n" + 312 " \"name\":\"前端六組\",\n" + 313 " \"status\":0,\n" + 314 " \"fullName\":\"應用技術研發一中心/前端研發部/前端三部/前端六組\"\n" + 315 " },\n" + 316 " {\n" + 317 " \"id\":50090796,\n" + 318 " \"parentId\":50091814,\n" + 319 " \"name\":\"前端七組\",\n" + 320 " \"status\":0,\n" + 321 " \"fullName\":\"應用技術研發一中心/前端研發部/前端三部/前端七組\"\n" + 322 " },\n" + 323 " {\n" + 324 " \"id\":50091817,\n" + 325 " \"parentId\":50091814,\n" + 326 " \"name\":\"前端八組\",\n" + 327 " \"status\":0,\n" + 328 " \"fullName\":\"應用技術研發一中心/前端研發部/前端三部/前端八組\"\n" + 329 " },\n" + 330 " {\n" + 331 " \"id\":50091818,\n" + 332 " \"parentId\":50091814,\n" + 333 " \"name\":\"前端九組\",\n" + 334 " \"status\":0,\n" + 335 " \"fullName\":\"應用技術研發一中心/前端研發部/前端三部/前端九組\"\n" + 336 " },\n" + 337 " {\n" + 338 " \"id\":50090195,\n" + 339 " \"parentId\":50090193,\n" + 340 " \"name\":\"研發一部\",\n" + 341 " \"status\":0,\n" + 342 " \"fullName\":\"應用技術研發一中心/研發一部\"\n" + 343 " },\n" + 344 " {\n" + 345 " \"id\":50090620,\n" + 346 " \"parentId\":50090195,\n" + 347 " \"name\":\"策略管理組\",\n" + 348 " \"status\":0,\n" + 349 " \"fullName\":\"應用技術研發一中心/研發一部/策略管理組\"\n" + 350 " },\n" + 351 " {\n" + 352 " \"id\":50090621,\n" + 353 " \"parentId\":50090195,\n" + 354 " \"name\":\"集中管理組\",\n" + 355 " \"status\":0,\n" + 356 " \"fullName\":\"應用技術研發一中心/研發一部/集中管理組\"\n" + 357 " },\n" + 358 " {\n" + 359 " \"id\":50090622,\n" + 360 " \"parentId\":50090195,\n" + 361 " \"name\":\"產品規划與設計組\",\n" + 362 " \"status\":0,\n" + 363 " \"fullName\":\"應用技術研發一中心/研發一部/產品規划與設計組\"\n" + 364 " },\n" + 365 " {\n" + 366 " \"id\":50090632,\n" + 367 " \"parentId\":50090195,\n" + 368 " \"name\":\"研發管理組\",\n" + 369 " \"status\":0,\n" + 370 " \"fullName\":\"應用技術研發一中心/研發一部/研發管理組\"\n" + 371 " },\n" + 372 " {\n" + 373 " \"id\":50091022,\n" + 374 " \"parentId\":50090195,\n" + 375 " \"name\":\"解決方案組\",\n" + 376 " \"status\":0,\n" + 377 " \"fullName\":\"應用技術研發一中心/研發一部/解決方案組\"\n" + 378 " },\n" + 379 " {\n" + 380 " \"id\":50091023,\n" + 381 " \"parentId\":50090195,\n" + 382 " \"name\":\"公共服務組\",\n" + 383 " \"status\":0,\n" + 384 " \"fullName\":\"應用技術研發一中心/研發一部/公共服務組\"\n" + 385 "\n" + 386 " },\n" + 387 " {\n" + 388 " \"id\":50091024,\n" + 389 " \"parentId\":50090195,\n" + 390 " \"name\":\"網絡拓普組\",\n" + 391 " \"status\":0,\n" + 392 " \"fullName\":\"應用技術研發一中心/研發一部/網絡拓普組\"\n" + 393 " },\n" + 394 " {\n" + 395 " \"id\":50090197,\n" + 396 " \"parentId\":50090193,\n" + 397 " \"name\":\"研發三部\",\n" + 398 " \"status\":0,\n" + 399 " \"fullName\":\"應用技術研發一中心/研發三部\"\n" + 400 " },\n" + 401 " {\n" + 402 " \"id\":50090232,\n" + 403 " \"parentId\":50090197,\n" + 404 " \"name\":\"工業安全服務端研發組\",\n" + 405 " \"status\":0,\n" + 406 " \"fullName\":\"應用技術研發一中心/研發三部/工業安全服務端研發組\"\n" + 407 " },\n" + 408 " {\n" + 409 " \"id\":50090631,\n" + 410 " \"parentId\":50090193,\n" + 411 " \"name\":\"設計與研發支撐部\",\n" + 412 " \"status\":0,\n" + 413 " \"fullName\":\"應用技術研發一中心/設計與研發支撐部\"\n" + 414 " },\n" + 415 " {\n" + 416 " \"id\":50090633,\n" + 417 " \"parentId\":50090193,\n" + 418 " \"name\":\"UED\",\n" + 419 " \"status\":0,\n" + 420 " \"fullName\":\"應用技術研發一中心/UED\"\n" + 421 " },\n" + 422 " {\n" + 423 " \"id\":50090799,\n" + 424 " \"parentId\":50090193,\n" + 425 " \"name\":\"武漢研發部\",\n" + 426 " \"status\":0,\n" + 427 " \"fullName\":\"應用技術研發一中心/武漢研發部\"\n" + 428 " },\n" + 429 " {\n" + 430 " \"id\":50090800,\n" + 431 " \"parentId\":50090799,\n" + 432 " \"name\":\"武漢前端一組\",\n" + 433 " \"status\":0,\n" + 434 " \"fullName\":\"應用技術研發一中心/武漢研發部/武漢前端一組\"\n" + 435 " },\n" + 436 " {\n" + 437 " \"id\":50090801,\n" + 438 " \"parentId\":50090799,\n" + 439 " \"name\":\"武漢前端二組\",\n" + 440 " \"status\":0,\n" + 441 " \"fullName\":\"應用技術研發一中心/武漢研發部/武漢前端二組\"\n" + 442 " }]\n"; 443 //字符串轉換為List 444 JSONArray jsonArray = JSONArray.parseArray(strJson); 445 List<Node> rootNode = (List<Node>)JSONArray.parseArray(strJson,Node.class); 446 // 查看結果 447 // for (Node node : rootNode) { 448 // System.out.println(node); 449 // } 450 // 最后的結果 451 List<Node> nodeList = new ArrayList<>(); 452 // 先找到所有的一級節點 453 for (int i = 0; i < rootNode.size(); i++) { 454 int index = 1; 455 for (int j = 0; j < rootNode.size();j++) { 456 if(rootNode.get(i).getParentId()==rootNode.get(j).getId()){ 457 index++; 458 } 459 } 460 //如果該ParentId無相等的id,則index仍然為1。將一級節點加入最后結果List中 461 if(index==1){ 462 nodeList.add(rootNode.get(i)); 463 } 464 } 465 // 為一級節點設置子節點,getChild是遞歸調用的 466 for (Node node : nodeList) { 467 node.setChildrenList(getChild(node.getId(), rootNode)); 468 } 469 Map<String,Object> jsonMap = new HashMap<>(); 470 jsonMap.put("node", nodeList); 471 System.out.println(JSONObject.toJSONString(jsonMap)); 472 } 473 474 private static List getChild(int id, List<Node> rootNode) { 475 // 子節點 476 List<Node> childList = new ArrayList<>(); 477 for (Node node : rootNode) { 478 // 遍歷所有節點,如果該節點的父類id等於參數id,則作為孩子節點加入該節點中 479 if (node.getParentId()==id) { 480 childList.add(node); 481 } 482 483 } 484 // 把孩子節點的孩子節點循環一遍 485 for (Node node : childList) { 486 // 遞歸 487 node.setChildrenList(getChild(node.getId(), rootNode)); 488 } // 遞歸退出條件 489 if (childList.size() == 0) { 490 return null; 491 } 492 return childList; 493 } 494 495 }
1 package com.example.rabbitmq2; 2 3 import com.alibaba.fastjson.JSONObject; 4 import lombok.Data; 5 import lombok.Getter; 6 import lombok.Setter; 7 8 import java.util.ArrayList; 9 import java.util.Collections; 10 import java.util.Iterator; 11 import java.util.List; 12 13 @Data 14 public class Node { 15 /** 16 * 節點編號 17 */ 18 public int id; 19 /** 20 * 父節點編號 21 */ 22 public int parentId; 23 /** 24 * 節點名稱 25 */ 26 public String name; 27 /** 28 * 節點狀態 29 */ 30 public int status; 31 /** 32 * 節點全稱 33 */ 34 public String fullName; 35 36 /** 37 * 孩子節點列表 38 */ 39 private List childrenList = new ArrayList(); 40 }
相關的博客: