1 package com.study;
2
3 import java.util.ArrayList;
4 import java.util.HashMap;
5 import java.util.List;
6 import java.util.Map;
7 import java.util.Map.Entry;
8
9 import com.alibaba.fastjson.JSONArray;
10 import com.alibaba.fastjson.JSONObject;
11
12 public class SteelTree {
13
14 public static void main(String[] args) {
15 // get datas
16 List<Map<String, Object>> records = getRecords();
17
18 // Result JSON
19 JSONObject result = new JSONObject();
20
21 // record temp json
22 JSONObject recordJson = new JSONObject();
23
24 // Unknown json
25 JSONObject unknownRecord = new JSONObject();
26
27 // root id
28 String firstParent = "00000";
29
30 for (int i = 0, l = records.size(); i < l; i++) {
31 Map<String, Object> record = records.get(i);
32
33 // if parentid is null.
34 String parentId;
35 if (record.get("parentid") == null) {
36 // TODO
37 parentId = "00000";
38 } else {
39 parentId = record.get("parentid").toString();
40 }
41
42 // set default JSON and childern node
43 JSONObject node = new JSONObject();
44 node.put("id", record.get("id").toString());
45 node.put("name", record.get("name").toString());
46 node.put("parentid", parentId);
47 node.put("children", new JSONArray());
48
49 // if root node
50 if (parentId.equals(firstParent)) {
51 result.put(record.get("id").toString(), node);
52 recordJson.put(record.get("id").toString(), node);
53
54 // if parent exist
55 } else if (recordJson.containsKey(parentId)) {
56 // add children
57 recordJson.getJSONObject(parentId).getJSONArray("children").add(node);
58 recordJson.put(record.get("id").toString(), node);
59 // Unknown relation node
60 } else {
61 String nodeId = record.get("id").toString();
62 if (unknownRecord.containsKey(parentId)) {
63 // add children
64 unknownRecord.getJSONObject(parentId).getJSONArray("children").add(node);
65 recordJson.put(nodeId, node);
66 } else {
67 // find subnode
68 for (Entry<String, Object> entry : unknownRecord.entrySet()) {
69 JSONObject tempNode = (JSONObject) entry.getValue();
70 if (tempNode.getString("parentid").equals(nodeId)) {
71 node.getJSONArray("children").add(tempNode);
72 recordJson.put(tempNode.get("id").toString(), tempNode);
73 unknownRecord.remove(tempNode.get("id").toString());
74 break;
75 }
76 }
77 unknownRecord.put(nodeId, node);
78 }
79 }
80 }
81
82 // unknownRecord add to result
83 // find subnode
84 for (Entry<String, Object> entry : unknownRecord.entrySet()) {
85 JSONObject tempNode = (JSONObject) entry.getValue();
86 String tempNodeId = tempNode.getString("parentid");
87 if (recordJson.containsKey(tempNodeId)) {
88 // add children
89 recordJson.getJSONObject(tempNodeId).getJSONArray("children").add(tempNode);
90 } else {
91 // Error node
92 System.out.println("========================ERROR>> " + tempNodeId + "\t\t" + tempNode.toString());
93 }
94 }
95 System.out.println(result.toString());
96 } // End main
97
98 private static List<Map<String, Object>> getRecords() {
99 List<Map<String, Object>> result = new ArrayList<>();
100
101 // first record
102 Map<String, Object> red0101 = new HashMap<>();
103 red0101.put("id", "U0003");
104 red0101.put("name", "wangwu");
105 red0101.put("parentid", "U0001");
106 result.add(red0101);
107
108 Map<String, Object> red010102 = new HashMap<>();
109 red010102.put("id", "U0006");
110 red010102.put("name", "chenba");
111 red010102.put("parentid", "U0003");
112 result.add(red010102);
113
114 Map<String, Object> red01 = new HashMap<>();
115 red01.put("id", "U0001");
116 red01.put("name", "zhengsan");
117 red01.put("parentid", "00000");
118 result.add(red01);
119
120 Map<String, Object> red02 = new HashMap<>();
121 red02.put("id", "U0002");
122 red02.put("name", "lisi");
123 red02.put("parentid", "00000");
124 result.add(red02);
125
126 Map<String, Object> red0102 = new HashMap<>();
127 red0102.put("id", "U0004");
128 red0102.put("name", "zhaolu");
129 red0102.put("parentid", "U0001");
130 result.add(red0102);
131
132 Map<String, Object> red010101 = new HashMap<>();
133 red010101.put("id", "U0005");
134 red010101.put("name", "maqi");
135 red010101.put("parentid", "U0003");
136 result.add(red010101);
137
138 return result;
139 }
140
141 }