树的构建

网址http://www.jb51.net/article/120571.htm

 

我们在做Java web项目时,前端控件例如国家-省-市-区-县等树形列表,常常需要多级树形json数据

例如:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

[

 {

 "name": "商品目录",

 "pid": "-1",

 "id": "1",

 "children": [

  {

  "name": "日用品",

  "pid": "1",

  "id": "11",

  "children": [

   {

   "name": "洗发水",

   "pid": "11",

   "id": "111",

   "children": [

    {

     "name": "霸王",

     "pid": "111",

     "id": "1111",

     "children": []

    }

   ]

   }

  ]

  },

  {

  "name": "食品",

  "pid": "1",

  "id": "12",

  "children": []

  }

 ]

 }

]

 

 

 

整体思路分为两步,第一步获取目录及其所有子目录,获取后的列表形式如下:

1

2

3

4

5

6

7

[

 {"id":"1","pid":"-1","name":"商品目录"},

 {"id":"11","pid":"1","name":"日用品"},

 {"id":"12","pid":"1","name":"食品"},

 {"id":"111","pid":"11","name":"洗发水"},

 {"id":"1111","pid":"111","name":"霸王"}

]

 

 

 

 

第二步,利用递归思想拼装该数据,拼装方法的工具类如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

package *.*.*;

 

import net.sf.json.JSONArray;

 

import java.util.ArrayList;

import java.util.List;

 

/**

 * 构造目录JSON树

 * Created by fukang on 2017/5/26 0026.

 */

public class TreeBuilder {

 

 List<Node> nodes = new ArrayList<>();

 

 public String buildTree(List<Node> nodes) {

 

  TreeBuilder treeBuilder = new TreeBuilder(nodes);

 

  return treeBuilder.buildJSONTree();

 }

 

 public TreeBuilder() {

 }

 

 public TreeBuilder(List<Node> nodes) {

  super();

  this.nodes = nodes;

 }

 

 // 构建JSON树形结构

 public String buildJSONTree() {

  List<Node> nodeTree = buildTree();

  JSONArray jsonArray = JSONArray.fromObject(nodeTree);

  return jsonArray.toString();

 }

 

 // 构建树形结构

 public List<Node> buildTree() {

  List<Node> treeNodes = new ArrayList<>();

  List<Node> rootNodes = getRootNodes();

  for (Node rootNode : rootNodes) {

   buildChildNodes(rootNode);

   treeNodes.add(rootNode);

  }

  return treeNodes;

 }

 

 // 递归子节点

 public void buildChildNodes(Node node) {

  List<Node> children = getChildNodes(node);

  if (!children.isEmpty()) {

   for (Node child : children) {

    buildChildNodes(child);

   }

   node.setChildren(children);

  }

 }

 

 // 获取父节点下所有的子节点

 public List<Node> getChildNodes(Node pnode) {

  List<Node> childNodes = new ArrayList<>();

  for (Node n : nodes) {

   if (pnode.getId().equals(n.getPid())) {

    childNodes.add(n);

   }

  }

  return childNodes;

 }

 

 // 判断是否为根节点

 public boolean rootNode(Node node) {

  boolean isRootNode = true;

  for (Node n : nodes) {

   if (node.getPid().equals(n.getId())) {

    isRootNode = false;

    break;

   }

  }

  return isRootNode;

 }

 

 // 获取集合中所有的根节点

 public List<Node> getRootNodes() {

  List<Node> rootNodes = new ArrayList<>();

  for (Node n : nodes) {

   if (rootNode(n)) {

    rootNodes.add(n);

   }

  }

  return rootNodes;

 }

 

 public static class Node {

 

  private String id;

  private String pid;

  private String name;

  private List<Node> children;

 

  public Node() {

  }

 

  public Node(String id, String pid, String name) {

   super();

   this.id = id;

   this.pid = pid;

   this.name = name;

  }

 

  public String getId() {

   return id;

  }

 

  public void setId(String id) {

   this.id = id;

  }

 

  public String getPid() {

   return pid;

  }

 

  public void setPid(String pid) {

   this.pid = pid;

  }

 

  public String getName() {

   return name;

  }

 

  public void setName(String name) {

   this.name = name;

  }

 

 

  public List<Node> getChildren() {

   return children;

  }

 

  public void setChildren(List<Node> children) {

   this.children = children;

  }

 }

}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值