本文展示了两个实现方法的代码。两个代码的实现方法不同,代码2更为简单。
先看一下最后实现的结果:
最后结果-json
代码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 ="[ " +"" + 18 " { " + 19 " "id":50090113, " + 20 " "parentId":50000001, " + 21 " "name":"应用技术研发二中心", " + 22 " "status":0, " + 23 " "fullName":"应用技术研发二中心" " + 24 " }, " + 25 " { " + 26 " "id":50090193, " + 27 " "parentId":50000000, " + 28 " "name":"应用技术研发一中心", " + 29 " "status":0, " + 30 " "fullName":"应用技术研发一中心" " + 31 " }, " + 32 " { " + 33 " "id":50090194, " + 34 " "parentId":50090193, " + 35 " "name":"前端研发部", " + 36 " "status":0, " + 37 " "fullName":"应用技术研发一中心/前端研发部" " + 38 " }, " + 39 " { " + 40 " "id":50005413, " + 41 " "parentId":50090194, " + 42 " "name":"安全网关产品前端研发组", " + 43 " "status":1, " + 44 " "fullName":"应用技术研发中心/前端研发部/安全网关产品前端研发组" " + 45 " }, " + 46 " { " + 47 " "id":50005415, " + 48 " "parentId":50090194, " + 49 " "name":"前端研发二组", " + 50 " "status":1, " + 51 " "fullName":"应用技术研发中心/前端研发部/前端研发二组" " + 52 " }, " + 53 " { " + 54 " "id":50090199, " + 55 " "parentId":50090194, " + 56 " "name":"云安全前端研发组", " + 57 " "status":1, " + 58 " "fullName":"应用技术研发中心/前端研发部/云安全前端研发组" " + 59 " }, " + 60 " { " + 61 " "id":50090200, " + 62 " "parentId":50090194, " + 63 " "name":"威胁情报前端研发组", " + 64 " "status":1, " + 65 " "fullName":"应用技术研发中心/前端研发部/威胁情报前端研发组" " + 66 " }, " + 67 " { " + 68 " "id":50090201, " + 69 " "parentId":50090194, " + 70 " "name":"大数据与安全运营前端产品组", " + 71 " "status":1, " + 72 " "fullName":"应用技术研发中心/前端研发部/大数据与安全运营前端产品组" " + 73 " " + 74 " }, " + 75 " { " + 76 " "id":50090202, " + 77 " "parentId":50090194, " + 78 " "name":"大数据与安全运营前端架构组", " + 79 " "status":1, " + 80 " "fullName":"应用技术研发中心/前端研发部/大数据与安全运营前端架构组" " + 81 " " + 82 " }, " + 83 " { " + 84 " "id":50090203, " + 85 " "parentId":50090194, " + 86 " "name":"大数据与安全运营前端研发二组", " + 87 " "status":1, " + 88 " " + 89 " "fullName":"应用技术研发中心/前端研发部/大数据与安全运营前端研发二组" " + 90 " }, " + 91 " { " + 92 " "id":50090204, " + 93 " "parentId":50090194, " + 94 " "name":"大数据与安全运营前端研发三组", " + 95 " "status":1, " + 96 " "fullName":"应用技术研发中心/前端研发部/大数据与安全运营前端研发三组" " + 97 " " + 98 " }, " + 99 " { " + 100 " "id":50090205, " + 101 " "parentId":50090194, " + 102 " "name":"大数据与安全运营前端研发四组", " + 103 " "status":1, " + 104 " " + 105 " "fullName":"应用技术研发中心/前端研发部/大数据与安全运营前端研发四组" " + 106 " " + 107 " }, " + 108 " { " + 109 " "id":50090206, " + 110 " "parentId":50090194, " + 111 " "name":"大数据与安全运营前端研发运营商部", " + 112 " "status":1, " + 113 " " + 114 " "fullName":"应用技术研发中心/前端研发部/大数据与安全运营前端研发运营商部" " + 115 " " + 116 " }, " + 117 " { " + 118 " "id":50090207, " + 119 " "parentId":50090194, " + 120 " "name":"大数据与安全运营前端研发政企部", " + 121 " "status":1, " + 122 " "fullName":"应用技术研发中心/前端研发部/大数据与安全运营前端研发政企部" " + 123 " }, " + 124 " { " + 125 " "id":50090208, " + 126 " "parentId":50090194, " + 127 " "name":"态势感知前端研发组", " + 128 " "status":1, " + 129 " "fullName":"应用技术研发中心/前端研发部/态势感知前端研发组" " + 130 " }, " + 131 " { " + 132 " "id":50090209, " + 133 " "parentId":50090194, " + 134 " "name":"大数据应用前端研发组", " + 135 " "status":1, " + 136 " "fullName":"应用技术研发中心/前端研发部/大数据应用前端研发组" " + 137 " }, " + 138 " { " + 139 " "id":50090210, " + 140 " "parentId":50090194, " + 141 " "name":"大数据与威胁分析前端研发一组", " + 142 " "status":1, " + 143 " "fullName":"应用技术研发中心/前端研发部/大数据与威胁分析前端研发一组" " + 144 " }, " + 145 " { " + 146 " "id":50090211, " + 147 " "parentId":50090194, " + 148 " "name":"大数据与威胁公司前端研发二组", " + 149 " "status":1, " + 150 " "fullName":"应用技术研发中心/前端研发部/大数据与威胁公司前端研发二组" " + 151 " }, " + 152 " { " + 153 " "id":50090212, " + 154 " "parentId":50090194, " + 155 " "name":"大数据与威胁分析前端研发三组", " + 156 " "status":1, " + 157 " "fullName":"应用技术研发中心/前端研发部/大数据与威胁分析前端研发三组" " + 158 " }, " + 159 " { " + 160 " "id":50090213, " + 161 " "parentId":50090194, " + 162 " "name":"工业安全前端研发组", " + 163 " "status":1, " + 164 " "fullName":"应用技术研发中心/前端研发部/工业安全前端研发组" " + 165 " }, " + 166 " { " + 167 " "id":50090214, " + 168 " "parentId":50090194, " + 169 " "name":"行为安全前端研发组", " + 170 " "status":1, " + 171 " "fullName":"应用技术研发中心/前端研发部/行为安全前端研发组" " + 172 " }, " + 173 " { " + 174 " "id":50090215, " + 175 " "parentId":50090194, " + 176 " "name":"基础大数据前端研发组", " + 177 " "status":1, " + 178 " "fullName":"应用技术研发中心/前端研发部/基础大数据前端研发组" " + 179 " }, " + 180 " { " + 181 " "id":50090216, " + 182 " "parentId":50090194, " + 183 " "name":"应用产品前端研发组", " + 184 " "status":1, " + 185 " "fullName":"应用技术研发中心/前端研发部/应用产品前端研发组" " + 186 " }, " + 187 " { " + 188 " "id":50090217, " + 189 " "parentId":50090194, " + 190 " "name":"终端安全产品前端研发组", " + 191 " "status":0, " + 192 " "fullName":"应用技术研发一中心/前端研发部/终端安全产品前端研发组" " + 193 " }, " + 194 " { " + 195 " "id":50090218, " + 196 " "parentId":50090194, " + 197 " "name":"安全产品前端研发组", " + 198 " "status":1, " + 199 " "fullName":"应用技术研发中心/前端研发部/安全产品前端研发组" " + 200 " }, " + 201 " { " + 202 " "id":50090219, " + 203 " "parentId":50090194, " + 204 " "name":"数据安全前端研发组", " + 205 " "status":0, " + 206 " "fullName":"应用技术研发一中心/前端研发部/数据安全前端研发组" " + 207 " }, " + 208 " { " + 209 " "id":50090220, " + 210 " "parentId":50090194, " + 211 " "name":"运维前端研发组", " + 212 " "status":1, " + 213 " "fullName":"应用技术研发中心/前端研发部/运维前端研发组" " + 214 " }, " + 215 " { " + 216 " "id":50090221, " + 217 " "parentId":50090194, " + 218 " "name":"华南基地前端研发组", " + 219 " "status":1, " + 220 " "fullName":"应用技术研发中心/前端研发部/华南基地前端研发组" " + 221 " }, " + 222 " { " + 223 " "id":50090222, " + 224 " "parentId":50090194, " + 225 " "name":"补天产品前端研发部", " + 226 " "status":1, " + 227 " "fullName":"应用技术研发中心/前端研发部/补天产品前端研发部" " + 228 " }, " + 229 " { " + 230 " "id":50090789, " + 231 " "parentId":50090194, " + 232 " "name":"前端一部", " + 233 " "status":0, " + 234 " "fullName":"应用技术研发一中心/前端研发部/前端一部" " + 235 " }, " + 236 " { " + 237 " "id":50090790, " + 238 " "parentId":50090789, " + 239 " "name":"前端一组", " + 240 " "status":0, " + 241 " "fullName":"应用技术研发一中心/前端研发部/前端一部/前端一组" " + 242 " }, " + 243 " { " + 244 " "id":50090795, " + 245 " "parentId":50090789, " + 246 " "name":"前端三组", " + 247 " "status":0, " + 248 " "fullName":"应用技术研发一中心/前端研发部/前端一部/前端三组" " + 249 " }, " + 250 " { " + 251 " "id":50090797, " + 252 " "parentId":50090789, " + 253 " "name":"珠海组", " + 254 " "status":0, " + 255 " "fullName":"应用技术研发一中心/前端研发部/前端一部/珠海组" " + 256 " }, " + 257 " { " + 258 " "id":50091815, " + 259 " "parentId":50090789, " + 260 " "name":"西安组", " + 261 " "status":0, " + 262 " "fullName":"应用技术研发一中心/前端研发部/前端一部/西安组" " + 263 " }, " + 264 " { " + 265 " "id":50090793, " + 266 " "parentId":50090194, " + 267 " "name":"前端二部", " + 268 " "status":0, " + 269 " "fullName":"应用技术研发一中心/前端研发部/前端二部" " + 270 " }, " + 271 " { " + 272 " "id":50090791, " + 273 " "parentId":50090793, " + 274 " "name":"前端四组", " + 275 " "status":0, " + 276 " "fullName":"应用技术研发一中心/前端研发部/前端二部/前端四组" " + 277 " }, " + 278 " { " + 279 " "id":50090794, " + 280 " "parentId":50090793, " + 281 " "name":"前端二组", " + 282 " "status":0, " + 283 " " + 284 " "fullName":"应用技术研发一中心/前端研发部/前端二部/前端二组" " + 285 " }, " + 286 " { " + 287 " "id":50091816, " + 288 " "parentId":50090793, " + 289 " "name":"上海组", " + 290 " "status":0, " + 291 " "fullName":"应用技术研发一中心/前端研发部/前端二部/上海组" " + 292 " }, " + 293 " { " + 294 " "id":50090798, " + 295 " "parentId":50090194, " + 296 " "name":"共性技术组", " + 297 " "status":0, " + 298 " "fullName":"应用技术研发一中心/前端研发部/共性技术组" " + 299 " }, " + 300 " { " + 301 " "id":50091814, " + 302 " "parentId":50090194, " + 303 " "name":"前端三部", " + 304 " "status":0, " + 305 " "fullName":"应用技术研发一中心/前端研发部/前端三部" " + 306 " }, " + 307 " { " + 308 " "id":50090792, " + 309 " "parentId":50091814, " + 310 " "name":"前端六组", " + 311 " "status":0, " + 312 " "fullName":"应用技术研发一中心/前端研发部/前端三部/前端六组" " + 313 " }, " + 314 " { " + 315 " "id":50090796, " + 316 " "parentId":50091814, " + 317 " "name":"前端七组", " + 318 " "status":0, " + 319 " "fullName":"应用技术研发一中心/前端研发部/前端三部/前端七组" " + 320 " }, " + 321 " { " + 322 " "id":50091817, " + 323 " "parentId":50091814, " + 324 " "name":"前端八组", " + 325 " "status":0, " + 326 " "fullName":"应用技术研发一中心/前端研发部/前端三部/前端八组" " + 327 " }, " + 328 " { " + 329 " "id":50091818, " + 330 " "parentId":50091814, " + 331 " "name":"前端九组", " + 332 " "status":0, " + 333 " "fullName":"应用技术研发一中心/前端研发部/前端三部/前端九组" " + 334 " }, " + 335 " { " + 336 " "id":50090195, " + 337 " "parentId":50090193, " + 338 " "name":"研发一部", " + 339 " "status":0, " + 340 " "fullName":"应用技术研发一中心/研发一部" " + 341 " }, " + 342 " { " + 343 " "id":50090620, " + 344 " "parentId":50090195, " + 345 " "name":"策略管理组", " + 346 " "status":0, " + 347 " "fullName":"应用技术研发一中心/研发一部/策略管理组" " + 348 " }, " + 349 " { " + 350 " "id":50090621, " + 351 " "parentId":50090195, " + 352 " "name":"集中管理组", " + 353 " "status":0, " + 354 " "fullName":"应用技术研发一中心/研发一部/集中管理组" " + 355 " }, " + 356 " { " + 357 " "id":50090622, " + 358 " "parentId":50090195, " + 359 " "name":"产品规划与设计组", " + 360 " "status":0, " + 361 " "fullName":"应用技术研发一中心/研发一部/产品规划与设计组" " + 362 " }, " + 363 " { " + 364 " "id":50090632, " + 365 " "parentId":50090195, " + 366 " "name":"研发管理组", " + 367 " "status":0, " + 368 " "fullName":"应用技术研发一中心/研发一部/研发管理组" " + 369 " }, " + 370 " { " + 371 " "id":50091022, " + 372 " "parentId":50090195, " + 373 " "name":"解决方案组", " + 374 " "status":0, " + 375 " "fullName":"应用技术研发一中心/研发一部/解决方案组" " + 376 " }, " + 377 " { " + 378 " "id":50091023, " + 379 " "parentId":50090195, " + 380 " "name":"公共服务组", " + 381 " "status":0, " + 382 " "fullName":"应用技术研发一中心/研发一部/公共服务组" " + 383 " " + 384 " }, " + 385 " { " + 386 " "id":50091024, " + 387 " "parentId":50090195, " + 388 " "name":"网络拓普组", " + 389 " "status":0, " + 390 " "fullName":"应用技术研发一中心/研发一部/网络拓普组" " + 391 " }, " + 392 " { " + 393 " "id":50090197, " + 394 " "parentId":50090193, " + 395 " "name":"研发三部", " + 396 " "status":0, " + 397 " "fullName":"应用技术研发一中心/研发三部" " + 398 " }, " + 399 " { " + 400 " "id":50090232, " + 401 " "parentId":50090197, " + 402 " "name":"工业安全服务端研发组", " + 403 " "status":0, " + 404 " "fullName":"应用技术研发一中心/研发三部/工业安全服务端研发组" " + 405 " }, " + 406 " { " + 407 " "id":50090631, " + 408 " "parentId":50090193, " + 409 " "name":"设计与研发支撑部", " + 410 " "status":0, " + 411 " "fullName":"应用技术研发一中心/设计与研发支撑部" " + 412 " }, " + 413 " { " + 414 " "id":50090633, " + 415 " "parentId":50090193, " + 416 " "name":"UED", " + 417 " "status":0, " + 418 " "fullName":"应用技术研发一中心/UED" " + 419 " }, " + 420 " { " + 421 " "id":50090799, " + 422 " "parentId":50090193, " + 423 " "name":"武汉研发部", " + 424 " "status":0, " + 425 " "fullName":"应用技术研发一中心/武汉研发部" " + 426 " }, " + 427 " { " + 428 " "id":50090800, " + 429 " "parentId":50090799, " + 430 " "name":"武汉前端一组", " + 431 " "status":0, " + 432 " "fullName":"应用技术研发一中心/武汉研发部/武汉前端一组" " + 433 " }, " + 434 " { " + 435 " "id":50090801, " + 436 " "parentId":50090799, " + 437 " "name":"武汉前端二组", " + 438 " "status":0, " + 439 " "fullName":"应用技术研发一中心/武汉研发部/武汉前端二组" " + 440 " }] "; 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 ="[ " +"" + 20 " { " + 21 " "id":50090113, " + 22 " "parentId":50000001, " + 23 " "name":"应用技术研发二中心", " + 24 " "status":0, " + 25 " "fullName":"应用技术研发二中心" " + 26 " }, " + 27 " { " + 28 " "id":50090193, " + 29 " "parentId":50000000, " + 30 " "name":"应用技术研发一中心", " + 31 " "status":0, " + 32 " "fullName":"应用技术研发一中心" " + 33 " }, " + 34 " { " + 35 " "id":50090194, " + 36 " "parentId":50090193, " + 37 " "name":"前端研发部", " + 38 " "status":0, " + 39 " "fullName":"应用技术研发一中心/前端研发部" " + 40 " }, " + 41 " { " + 42 " "id":50005413, " + 43 " "parentId":50090194, " + 44 " "name":"安全网关产品前端研发组", " + 45 " "status":1, " + 46 " "fullName":"应用技术研发中心/前端研发部/安全网关产品前端研发组" " + 47 " }, " + 48 " { " + 49 " "id":50005415, " + 50 " "parentId":50090194, " + 51 " "name":"前端研发二组", " + 52 " "status":1, " + 53 " "fullName":"应用技术研发中心/前端研发部/前端研发二组" " + 54 " }, " + 55 " { " + 56 " "id":50090199, " + 57 " "parentId":50090194, " + 58 " "name":"云安全前端研发组", " + 59 " "status":1, " + 60 " "fullName":"应用技术研发中心/前端研发部/云安全前端研发组" " + 61 " }, " + 62 " { " + 63 " "id":50090200, " + 64 " "parentId":50090194, " + 65 " "name":"威胁情报前端研发组", " + 66 " "status":1, " + 67 " "fullName":"应用技术研发中心/前端研发部/威胁情报前端研发组" " + 68 " }, " + 69 " { " + 70 " "id":50090201, " + 71 " "parentId":50090194, " + 72 " "name":"大数据与安全运营前端产品组", " + 73 " "status":1, " + 74 " "fullName":"应用技术研发中心/前端研发部/大数据与安全运营前端产品组" " + 75 " " + 76 " }, " + 77 " { " + 78 " "id":50090202, " + 79 " "parentId":50090194, " + 80 " "name":"大数据与安全运营前端架构组", " + 81 " "status":1, " + 82 " "fullName":"应用技术研发中心/前端研发部/大数据与安全运营前端架构组" " + 83 " " + 84 " }, " + 85 " { " + 86 " "id":50090203, " + 87 " "parentId":50090194, " + 88 " "name":"大数据与安全运营前端研发二组", " + 89 " "status":1, " + 90 " " + 91 " "fullName":"应用技术研发中心/前端研发部/大数据与安全运营前端研发二组" " + 92 " }, " + 93 " { " + 94 " "id":50090204, " + 95 " "parentId":50090194, " + 96 " "name":"大数据与安全运营前端研发三组", " + 97 " "status":1, " + 98 " "fullName":"应用技术研发中心/前端研发部/大数据与安全运营前端研发三组" " + 99 " " + 100 " }, " + 101 " { " + 102 " "id":50090205, " + 103 " "parentId":50090194, " + 104 " "name":"大数据与安全运营前端研发四组", " + 105 " "status":1, " + 106 " " + 107 " "fullName":"应用技术研发中心/前端研发部/大数据与安全运营前端研发四组" " + 108 " " + 109 " }, " + 110 " { " + 111 " "id":50090206, " + 112 " "parentId":50090194, " + 113 " "name":"大数据与安全运营前端研发运营商部", " + 114 " "status":1, " + 115 " " + 116 " "fullName":"应用技术研发中心/前端研发部/大数据与安全运营前端研发运营商部" " + 117 " " + 118 " }, " + 119 " { " + 120 " "id":50090207, " + 121 " "parentId":50090194, " + 122 " "name":"大数据与安全运营前端研发政企部", " + 123 " "status":1, " + 124 " "fullName":"应用技术研发中心/前端研发部/大数据与安全运营前端研发政企部" " + 125 " }, " + 126 " { " + 127 " "id":50090208, " + 128 " "parentId":50090194, " + 129 " "name":"态势感知前端研发组", " + 130 " "status":1, " + 131 " "fullName":"应用技术研发中心/前端研发部/态势感知前端研发组" " + 132 " }, " + 133 " { " + 134 " "id":50090209, " + 135 " "parentId":50090194, " + 136 " "name":"大数据应用前端研发组", " + 137 " "status":1, " + 138 " "fullName":"应用技术研发中心/前端研发部/大数据应用前端研发组" " + 139 " }, " + 140 " { " + 141 " "id":50090210, " + 142 " "parentId":50090194, " + 143 " "name":"大数据与威胁分析前端研发一组", " + 144 " "status":1, " + 145 " "fullName":"应用技术研发中心/前端研发部/大数据与威胁分析前端研发一组" " + 146 " }, " + 147 " { " + 148 " "id":50090211, " + 149 " "parentId":50090194, " + 150 " "name":"大数据与威胁公司前端研发二组", " + 151 " "status":1, " + 152 " "fullName":"应用技术研发中心/前端研发部/大数据与威胁公司前端研发二组" " + 153 " }, " + 154 " { " + 155 " "id":50090212, " + 156 " "parentId":50090194, " + 157 " "name":"大数据与威胁分析前端研发三组", " + 158 " "status":1, " + 159 " "fullName":"应用技术研发中心/前端研发部/大数据与威胁分析前端研发三组" " + 160 " }, " + 161 " { " + 162 " "id":50090213, " + 163 " "parentId":50090194, " + 164 " "name":"工业安全前端研发组", " + 165 " "status":1, " + 166 " "fullName":"应用技术研发中心/前端研发部/工业安全前端研发组" " + 167 " }, " + 168 " { " + 169 " "id":50090214, " + 170 " "parentId":50090194, " + 171 " "name":"行为安全前端研发组", " + 172 " "status":1, " + 173 " "fullName":"应用技术研发中心/前端研发部/行为安全前端研发组" " + 174 " }, " + 175 " { " + 176 " "id":50090215, " + 177 " "parentId":50090194, " + 178 " "name":"基础大数据前端研发组", " + 179 " "status":1, " + 180 " "fullName":"应用技术研发中心/前端研发部/基础大数据前端研发组" " + 181 " }, " + 182 " { " + 183 " "id":50090216, " + 184 " "parentId":50090194, " + 185 " "name":"应用产品前端研发组", " + 186 " "status":1, " + 187 " "fullName":"应用技术研发中心/前端研发部/应用产品前端研发组" " + 188 " }, " + 189 " { " + 190 " "id":50090217, " + 191 " "parentId":50090194, " + 192 " "name":"终端安全产品前端研发组", " + 193 " "status":0, " + 194 " "fullName":"应用技术研发一中心/前端研发部/终端安全产品前端研发组" " + 195 " }, " + 196 " { " + 197 " "id":50090218, " + 198 " "parentId":50090194, " + 199 " "name":"安全产品前端研发组", " + 200 " "status":1, " + 201 " "fullName":"应用技术研发中心/前端研发部/安全产品前端研发组" " + 202 " }, " + 203 " { " + 204 " "id":50090219, " + 205 " "parentId":50090194, " + 206 " "name":"数据安全前端研发组", " + 207 " "status":0, " + 208 " "fullName":"应用技术研发一中心/前端研发部/数据安全前端研发组" " + 209 " }, " + 210 " { " + 211 " "id":50090220, " + 212 " "parentId":50090194, " + 213 " "name":"运维前端研发组", " + 214 " "status":1, " + 215 " "fullName":"应用技术研发中心/前端研发部/运维前端研发组" " + 216 " }, " + 217 " { " + 218 " "id":50090221, " + 219 " "parentId":50090194, " + 220 " "name":"华南基地前端研发组", " + 221 " "status":1, " + 222 " "fullName":"应用技术研发中心/前端研发部/华南基地前端研发组" " + 223 " }, " + 224 " { " + 225 " "id":50090222, " + 226 " "parentId":50090194, " + 227 " "name":"补天产品前端研发部", " + 228 " "status":1, " + 229 " "fullName":"应用技术研发中心/前端研发部/补天产品前端研发部" " + 230 " }, " + 231 " { " + 232 " "id":50090789, " + 233 " "parentId":50090194, " + 234 " "name":"前端一部", " + 235 " "status":0, " + 236 " "fullName":"应用技术研发一中心/前端研发部/前端一部" " + 237 " }, " + 238 " { " + 239 " "id":50090790, " + 240 " "parentId":50090789, " + 241 " "name":"前端一组", " + 242 " "status":0, " + 243 " "fullName":"应用技术研发一中心/前端研发部/前端一部/前端一组" " + 244 " }, " + 245 " { " + 246 " "id":50090795, " + 247 " "parentId":50090789, " + 248 " "name":"前端三组", " + 249 " "status":0, " + 250 " "fullName":"应用技术研发一中心/前端研发部/前端一部/前端三组" " + 251 " }, " + 252 " { " + 253 " "id":50090797, " + 254 " "parentId":50090789, " + 255 " "name":"珠海组", " + 256 " "status":0, " + 257 " "fullName":"应用技术研发一中心/前端研发部/前端一部/珠海组" " + 258 " }, " + 259 " { " + 260 " "id":50091815, " + 261 " "parentId":50090789, " + 262 " "name":"西安组", " + 263 " "status":0, " + 264 " "fullName":"应用技术研发一中心/前端研发部/前端一部/西安组" " + 265 " }, " + 266 " { " + 267 " "id":50090793, " + 268 " "parentId":50090194, " + 269 " "name":"前端二部", " + 270 " "status":0, " + 271 " "fullName":"应用技术研发一中心/前端研发部/前端二部" " + 272 " }, " + 273 " { " + 274 " "id":50090791, " + 275 " "parentId":50090793, " + 276 " "name":"前端四组", " + 277 " "status":0, " + 278 " "fullName":"应用技术研发一中心/前端研发部/前端二部/前端四组" " + 279 " }, " + 280 " { " + 281 " "id":50090794, " + 282 " "parentId":50090793, " + 283 " "name":"前端二组", " + 284 " "status":0, " + 285 " " + 286 " "fullName":"应用技术研发一中心/前端研发部/前端二部/前端二组" " + 287 " }, " + 288 " { " + 289 " "id":50091816, " + 290 " "parentId":50090793, " + 291 " "name":"上海组", " + 292 " "status":0, " + 293 " "fullName":"应用技术研发一中心/前端研发部/前端二部/上海组" " + 294 " }, " + 295 " { " + 296 " "id":50090798, " + 297 " "parentId":50090194, " + 298 " "name":"共性技术组", " + 299 " "status":0, " + 300 " "fullName":"应用技术研发一中心/前端研发部/共性技术组" " + 301 " }, " + 302 " { " + 303 " "id":50091814, " + 304 " "parentId":50090194, " + 305 " "name":"前端三部", " + 306 " "status":0, " + 307 " "fullName":"应用技术研发一中心/前端研发部/前端三部" " + 308 " }, " + 309 " { " + 310 " "id":50090792, " + 311 " "parentId":50091814, " + 312 " "name":"前端六组", " + 313 " "status":0, " + 314 " "fullName":"应用技术研发一中心/前端研发部/前端三部/前端六组" " + 315 " }, " + 316 " { " + 317 " "id":50090796, " + 318 " "parentId":50091814, " + 319 " "name":"前端七组", " + 320 " "status":0, " + 321 " "fullName":"应用技术研发一中心/前端研发部/前端三部/前端七组" " + 322 " }, " + 323 " { " + 324 " "id":50091817, " + 325 " "parentId":50091814, " + 326 " "name":"前端八组", " + 327 " "status":0, " + 328 " "fullName":"应用技术研发一中心/前端研发部/前端三部/前端八组" " + 329 " }, " + 330 " { " + 331 " "id":50091818, " + 332 " "parentId":50091814, " + 333 " "name":"前端九组", " + 334 " "status":0, " + 335 " "fullName":"应用技术研发一中心/前端研发部/前端三部/前端九组" " + 336 " }, " + 337 " { " + 338 " "id":50090195, " + 339 " "parentId":50090193, " + 340 " "name":"研发一部", " + 341 " "status":0, " + 342 " "fullName":"应用技术研发一中心/研发一部" " + 343 " }, " + 344 " { " + 345 " "id":50090620, " + 346 " "parentId":50090195, " + 347 " "name":"策略管理组", " + 348 " "status":0, " + 349 " "fullName":"应用技术研发一中心/研发一部/策略管理组" " + 350 " }, " + 351 " { " + 352 " "id":50090621, " + 353 " "parentId":50090195, " + 354 " "name":"集中管理组", " + 355 " "status":0, " + 356 " "fullName":"应用技术研发一中心/研发一部/集中管理组" " + 357 " }, " + 358 " { " + 359 " "id":50090622, " + 360 " "parentId":50090195, " + 361 " "name":"产品规划与设计组", " + 362 " "status":0, " + 363 " "fullName":"应用技术研发一中心/研发一部/产品规划与设计组" " + 364 " }, " + 365 " { " + 366 " "id":50090632, " + 367 " "parentId":50090195, " + 368 " "name":"研发管理组", " + 369 " "status":0, " + 370 " "fullName":"应用技术研发一中心/研发一部/研发管理组" " + 371 " }, " + 372 " { " + 373 " "id":50091022, " + 374 " "parentId":50090195, " + 375 " "name":"解决方案组", " + 376 " "status":0, " + 377 " "fullName":"应用技术研发一中心/研发一部/解决方案组" " + 378 " }, " + 379 " { " + 380 " "id":50091023, " + 381 " "parentId":50090195, " + 382 " "name":"公共服务组", " + 383 " "status":0, " + 384 " "fullName":"应用技术研发一中心/研发一部/公共服务组" " + 385 " " + 386 " }, " + 387 " { " + 388 " "id":50091024, " + 389 " "parentId":50090195, " + 390 " "name":"网络拓普组", " + 391 " "status":0, " + 392 " "fullName":"应用技术研发一中心/研发一部/网络拓普组" " + 393 " }, " + 394 " { " + 395 " "id":50090197, " + 396 " "parentId":50090193, " + 397 " "name":"研发三部", " + 398 " "status":0, " + 399 " "fullName":"应用技术研发一中心/研发三部" " + 400 " }, " + 401 " { " + 402 " "id":50090232, " + 403 " "parentId":50090197, " + 404 " "name":"工业安全服务端研发组", " + 405 " "status":0, " + 406 " "fullName":"应用技术研发一中心/研发三部/工业安全服务端研发组" " + 407 " }, " + 408 " { " + 409 " "id":50090631, " + 410 " "parentId":50090193, " + 411 " "name":"设计与研发支撑部", " + 412 " "status":0, " + 413 " "fullName":"应用技术研发一中心/设计与研发支撑部" " + 414 " }, " + 415 " { " + 416 " "id":50090633, " + 417 " "parentId":50090193, " + 418 " "name":"UED", " + 419 " "status":0, " + 420 " "fullName":"应用技术研发一中心/UED" " + 421 " }, " + 422 " { " + 423 " "id":50090799, " + 424 " "parentId":50090193, " + 425 " "name":"武汉研发部", " + 426 " "status":0, " + 427 " "fullName":"应用技术研发一中心/武汉研发部" " + 428 " }, " + 429 " { " + 430 " "id":50090800, " + 431 " "parentId":50090799, " + 432 " "name":"武汉前端一组", " + 433 " "status":0, " + 434 " "fullName":"应用技术研发一中心/武汉研发部/武汉前端一组" " + 435 " }, " + 436 " { " + 437 " "id":50090801, " + 438 " "parentId":50090799, " + 439 " "name":"武汉前端二组", " + 440 " "status":0, " + 441 " "fullName":"应用技术研发一中心/武汉研发部/武汉前端二组" " + 442 " }] "; 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 }
相关的博客: