java循环对象数组筛选父节点和子节点
时间: 2023-11-03 08:05:38 浏览: 93
假设有一个对象数组 `Node[] nodes`,每个节点对象有一个 `parentId` 属性表示父节点 id,现在需要根据父子关系筛选出所有的父节点和子节点。可以按照以下步骤实现:
1. 首先创建两个空的列表,分别存储父节点和子节点。`List<Node> parents = new ArrayList<>();` `List<Node> children = new ArrayList<>();`
2. 遍历节点数组,如果节点的 `parentId` 为空,即为根节点,将其加入父节点列表。否则,将其加入子节点列表。`for (Node node : nodes) {if (node.getParentId() == null) {parents.add(node);} else {children.add(node);}}`
3. 遍历子节点列表,将每个子节点的父节点加入父节点列表,如果该父节点已经在列表中,则不加入。`for (Node child : children) {Node parent = findParent(child, nodes);if (parent != null && !parents.contains(parent)) {parents.add(parent);}}`
4. 定义一个辅助方法 `findParent(Node child, Node[] nodes)`,用于查找子节点的父节点。在节点数组中查找 `parentId` 与子节点的 `id` 相等的节点并返回。如果找不到,则返回 null。
5. 最终得到的父节点列表即为所有的根节点,子节点列表即为所有的叶子节点。
下面是完整的代码示例:
```java
List<Node> parents = new ArrayList<>();
List<Node> children = new ArrayList<>();
// 遍历节点数组,将节点分为父节点和子节点
for (Node node : nodes) {
if (node.getParentId() == null) {
parents.add(node);
} else {
children.add(node);
}
}
// 遍历子节点列表,将每个子节点的父节点加入父节点列表
for (Node child : children) {
Node parent = findParent(child, nodes);
if (parent != null && !parents.contains(parent)) {
parents.add(parent);
}
}
// 查找子节点的父节点
private Node findParent(Node child, Node[] nodes) {
for (Node node : nodes) {
if (child.getParentId().equals(node.getId())) {
return node;
}
}
return null;
}
```
阅读全文