可以采用如下步骤:
- 创建一个 Map,key 是对象的 id,value 是对象本身。
- 遍历对象集合,将对象及其所有子对象都添加到 Map 中。
- 迭代 Map 中的对象,检测其父节点是否存在,存在则设置其父 id。
- 最后遍历 Map 中的所有对象,按照父 id 顺序插入数据库表中。
具体代码大概如下:
Map<Integer, Node> nodeMap = new HashMap<>();
for (Node node : nodeList) {
nodeMap.put(node.getId(), node);
addChildrenToMap(node.getChildren(), nodeMap);
}
// 设置父 id
for (Node node : nodeMap.values()) {
Node parent = nodeMap.get(node.getParentId());
if (parent != null) {
node.setParentId(parent.getId());
}
}
// 按照父 id 排序后插入数据库
List<Node> insertList = new ArrayList<>(nodeMap.values());
Collections.sort(insertList, (n1, n2) ->
Integer.compare(n1.getParentId(), n2.getParentId()));
for (Node node : insertList) {
// 插入数据库
}
addChildrenToMap()
方法用于递归添加子对象到 Map 中:
void addChildrenToMap(List<Node> children, Map<Integer, Node> nodeMap) {
for (Node child : children) {
nodeMap.put(child.getId(), child);
addChildrenToMap(child.getChildren(), nodeMap);
}
}
这个代码主要分为以下几个步骤:
- 创建一个 Map,用来存储所有对象,key 是对象 id,value 是对象本身。
Map<Integer, Node> nodeMap = new HashMap<>();
- 遍历对象集合,将所有对象及其子对象都添加到 Map 中。
for (Node node : nodeList) {
nodeMap.put(node.getId(), node);
addChildrenToMap(node.getChildren(), nodeMap);
}
addChildrenToMap()
方法是递归的添加子对象。
- 设置每个对象的父 id。
for (Node node : nodeMap.values()) {
Node parent = nodeMap.get(node.getParentId());
if (parent != null) {
node.setParentId(parent.getId());
}
}
- 根据父 id 排序对象集合。
Collections.sort(insertList, (n1, n2) ->
Integer.compare(n1.getParentId(), n2.getParentId()));
- 按照排序后的顺序插入数据库。
for (Node node : insertList) {
// 插入数据库
}
总的来说,第一步建立对象与 id 的映射;第二步递归添加所有子对象;第三步设置正确的父 id;第四步根据父 id 排序;最后第五步按顺序插入数据库,就能保存正确的树形结构了。
标签:node,Map,对象,Node,父子,nodeMap,树形,id,结构 From: https://www.cnblogs.com/easycoding20211115/p/17507723.html