在编码过程中,常会遇到类似文件目录、菜单展示的场景,时不时会遇到线性列表节点数据要转换成树形列表节点展示的情况,通常处理方法有递归、映射遍历,递归比较常见但是理解起来也有点绕,这里采用映射遍历的方式来构建直观好理解。
整体思路如下:
1.创建一个映射,将每个节点的ID映射到节点对象。
2.遍历节点列表,对于每个节点,查找其父节点,并将其添加到父节点的子节点列表中。
3.如果节点没有父节点(即它是根节点),我们将其添加到结果列表中。
首先,假设有节点Node类:
public class Node {
public int id;
public int parentId;
public List<Node> children;
public Node(int id, int parentId) {
this.id = id;
this.parentId = parentId;
this.children = new ArrayList<>();
}
}
然后,我们可以使用以下方法将线性列表转换为树形列表
public List<Node> convertListToTree(List<Node> nodes) {
// 1.创建一个映射,将每个节点的ID映射到节点对象
Map<Integer, Node> nodeMap = new HashMap<>();
for (Node node : nodes) {
nodeMap.put(node.id, node);
}
List<Node> result = new ArrayList<>();
// 2.遍历节点列表,对于每个节点,
for (Node node : nodes) {
if (node.parentId == 0) {
// 3.如果节点没有父节点(即它是根节点),我们将其添加到结果列表中
result.add(node);
} else {
// 查找其父节点,并将其添加到父节点的子节点列表中。
Node parent = nodeMap.get(node.parentId);
if (parent != null) {
parent.children.add(node);
}
}
}
return result;
}
整体思路是个直的,没有那么绕,主要借助Map先映射所有信息便于取,然后步骤parent.children.add(node)这个步骤由于对象是引用传递,不论是Map中映射的对象还是列表中的对象都是指向同一块内存确保了操作的节点是符合预期的节点。
949

被折叠的 条评论
为什么被折叠?



