首頁 > 易卦

構建多級有序樹形結構JSON的方法

作者:由 hellomrtree3 發表于 易卦日期:2022-12-16

json為什麼有的帶反斜槓

構建多級有序樹形結構JSON的方法

實現這樣一顆樹,需要設計兩個類:樹類(MultiwayTree)、節點類(Node);排序時還需要一個比較器類(NodeIDComparator);為了方便演示,還需要構造一些假的層次資料,因此還需要建一個構造假資料的類(VirtualDataGenerator),以下程式碼複製出來之後可直接執行測試:

package test;

import java。util。ArrayList;

import java。util。Comparator;

import java。util。HashMap;

import java。util。Iterator;

import java。util。List;

import java。util。Map;

import java。util。Set;

import java。util。Collections;

/**

* 多叉樹類

*/

public class MultiwayTree {

public static void main(String[] args) {

// 讀取層次資料結果集列表

List dataList = VirtualDataGenerator。getVirtualResult();

// 節點對映表,用於臨時儲存節點物件

HashMap nodeMap = new HashMap();

// 根節點

Node root = null;

// 將結果集存入對映表(後面將藉助對映表構造多叉樹)

for (Iterator it = dataList。iterator(); it。hasNext();) {

Map dataRecord = (Map) it。next();

Node node = new Node();

node。id = (String) dataRecord。get(“id”);

node。text = (String) dataRecord。get(“text”);

node。parentId = (String) dataRecord。get(“parentId”);

nodeMap。put(node。id, node);

}

// 構造無序的多叉樹

Set entrySet = nodeMap。entrySet();

for (Iterator it = entrySet。iterator(); it。hasNext();) {

Node node = (Node) ((Map。Entry) it。next())。getValue();

if (node。parentId == null || node。parentId。equals(“”)) {

root = node;

} else {

((Node) nodeMap。get(node。parentId))。addChild(node);

}

}

// 輸出無序的樹形結構的JSON字串

System。out。println(root);

// 對多叉樹進行橫向排序

root。sortChildren();

// 輸出有序的樹形結構的JSON字串

System。out。println(root);

// 程式輸出結果如下:

//

// 無序的樹形結構(格式化後的結果,可使用JSON格式化工具檢視,例如 http://jsonviewer。stack。hu/ 線上檢視器):

// {

// id : ‘100000’,

// text : ‘廊坊銀行總行’,

// children : [

// {

// id : ‘110000’,

// text : ‘廊坊分行’,

// children : [

// {

// id : ‘113000’,

// text : ‘廊坊銀行開發區支行’,

// leaf : true

// },

// {

// id : ‘111000’,

// text : ‘廊坊銀行金光道支行’,

// leaf : true

// },

// {

// id : ‘112000’,

// text : ‘廊坊銀行解放道支行’,

// children : [

// {

// id : ‘112200’,

// text : ‘廊坊銀行三大街支行’,

// leaf : true

// },

// {

// id : ‘112100’,

// text : ‘廊坊銀行廣陽道支行’,

// leaf : true

// }

// ]

// }

// ]

// }

// ]

// }

// 有序的樹形結構(格式化後的結果):

// {

// id : ‘100000’,

// text : ‘廊坊銀行總行’,

// children : [

// {

// id : ‘110000’,

// text : ‘廊坊分行’,

// children : [

// {

// id : ‘111000’,

// text : ‘廊坊銀行金光道支行’,

// leaf : true

// },

// {

// id : ‘112000’,

// text : ‘廊坊銀行解放道支行’,

// children : [

// {

// id : ‘112100’,

// text : ‘廊坊銀行廣陽道支行’,

// leaf : true

// },

// {

// id : ‘112200’,

// text : ‘廊坊銀行三大街支行’,

// leaf : true

// }

// ]

// },

// {

// id : ‘113000’,

// text : ‘廊坊銀行開發區支行’,

// leaf : true

// }

// ]

// }

// ]

// }

}

}

/**

* 節點類

*/

class Node {

/**

* 節點編號

*/

public String id;

/**

* 節點內容

*/

public String text;

/**

* 父節點編號

*/

public String parentId;

/**

* 孩子節點列表

*/

private List children = new ArrayList();

// 新增孩子節點

public void addChild(Node node) {

children。add(node);

}

// 先序遍歷,拼接JSON字串

public String toString() {

String result = “{” + “id : ‘” + id + “’” + “, text : ‘” + text + “’”;

if (children。size() != 0) {

result += “, children : [”;

for (int i = 0; i < children。size(); i++) {

result += ((Node) children。get(i))。toString() + “,”;

}

result = result。substring(0, result。length() - 1);

result += “]”;

} else {

result += “, leaf : true”;

}

return result + “}”;

}

// 兄弟節點橫向排序

public void sortChildren() {

if (children。size() != 0) {

// 對本層節點進行排序(可根據不同的排序屬性,傳入不同的比較器,這裡 傳入ID比較器)

Collections。sort(children, new NodeIDComparator());

// 對每個節點的下一層節點進行排序

for (int i = 0; i < children。size(); i++) {

((Node) children。get(i))。sortChildren();

}

}

}

}

/**

* 節點比較器

*/

class NodeIDComparator implements Comparator {

// 按照節點編號比較

public int compare(Object o1, Object o2) {

int j1 = Integer。parseInt(((Node) o1)。id);

int j2 = Integer。parseInt(((Node) o2)。id);

return (j1 < j2 ? -1 : (j1 == j2 ? 0 : 1));

}

}

/**

* 構造虛擬的層次資料

*/

class VirtualDataGenerator {

// 構造無序的結果集列表,實際應用中,該資料應該從資料庫中查詢獲得;

public static List getVirtualResult() {

List dataList = new ArrayList();

HashMap dataRecord1 = new HashMap();

dataRecord1。put(“id”, “112000”);

dataRecord1。put(“text”, “廊坊銀行解放道支行”);

dataRecord1。put(“parentId”, “110000”);

HashMap dataRecord2 = new HashMap();

dataRecord2。put(“id”, “112200”);

dataRecord2。put(“text”, “廊坊銀行三大街支行”);

dataRecord2。put(“parentId”, “112000”);

HashMap dataRecord3 = new HashMap();

dataRecord3。put(“id”, “112100”);

dataRecord3。put(“text”, “廊坊銀行廣陽道支行”);

dataRecord3。put(“parentId”, “112000”);

HashMap dataRecord4 = new HashMap();

dataRecord4。put(“id”, “113000”);

dataRecord4。put(“text”, “廊坊銀行開發區支行”);

dataRecord4。put(“parentId”, “110000”);

HashMap dataRecord5 = new HashMap();

dataRecord5。put(“id”, “100000”);

dataRecord5。put(“text”, “廊坊銀行總行”);

dataRecord5。put(“parentId”, “”);

HashMap dataRecord6 = new HashMap();

dataRecord6。put(“id”, “110000”);

dataRecord6。put(“text”, “廊坊分行”);

dataRecord6。put(“parentId”, “100000”);

HashMap dataRecord7 = new HashMap();

dataRecord7。put(“id”, “111000”);

dataRecord7。put(“text”, “廊坊銀行金光道支行”);

dataRecord7。put(“parentId”, “110000”);

dataList。add(dataRecord1);

dataList。add(dataRecord2);

dataList。add(dataRecord3);

dataList。add(dataRecord4);

dataList。add(dataRecord5);

dataList。add(dataRecord6);

dataList。add(dataRecord7);

return dataList;

}

}