思路

根据List中实体的id 、父级id构建树形结构

  • 取出一个元素
  • 遍历整个List
  • 若找到元素父级,则将元素设为其child
  • 同时此元素进行标记
  • 删除所有已标记元素

实体

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class DivEntity {

private String divCode;

private String divParentCode;

private String divName;

private List<DivEntity> children;

//contructor
//setter
//getter

}

构建方法

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
@Test
void testBuildTree(){

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

treeNodes.add(new DivEntity("2", "0", "陕西省"));
treeNodes.add(new DivEntity("21", "2", "西安市"));
treeNodes.add(new DivEntity("211", "21", "雁塔区"));
treeNodes.add(new DivEntity("212", "21", "未央区"));
treeNodes.add(new DivEntity("2121", "212", "浐灞"));

treeNodes.add(new DivEntity("11", "1", "成都市"));

// 设置 标志位,标记是否已经作为子节点
int[] treeNodeFlag = new int[treeNodes.size()];

//遍历list
for (int i = 0; i < treeNodes.size(); i++) {
DivEntity treeNode = treeNodes.get(i);
//如果元素不位于顶级
if(treeNode.getDivParentCode() != null && !treeNode.getDivParentCode().equals("0")){
//再次遍历List
for (DivEntity parentNode : treeNodes) {
//在整个list中查找元素的父级
if(treeNode.getDivParentCode().equals(parentNode.getDivCode())){
//将元素放入父级中,若其子树结构为空则先创建子树再加节点
if(parentNode.getChildren() == null){
parentNode.setChildren(new ArrayList<>());
}
parentNode.getChildren().add(treeNode);
// 如果变为子节点则标记
treeNodeFlag[i] = 1;
}
}
}
}

// 删除已经作为子节点的节节点
for (int i = 0; i < treeNodeFlag.length; i++) {
if(treeNodeFlag[i] == 1){
treeNodes.set(i, new DivEntity("-9999", "-9999", ""));
}
}
treeNodes.removeIf(treeNode ->treeNode.getDivCode().equals("-9999") && treeNode.getDivParentCode().equals("-9999"));

System.out.println("JSON.toJSONString(treeNodes) = " + JSON.toJSONString(treeNodes));
}



参考

https://blog.csdn.net/beidaol/article/details/93717986