递归查找嵌套ArrayList中目标对象T的实现方法问询
递归查找层级结构中目标对象的父节点实现
嘿,这个需求我刚好做过类似的,就是在嵌套的层级结构里找目标节点的直接父对象对吧?咱们一步步来实现它~
核心逻辑拆解
- 先看当前对象的
list字段,要是直接包含目标goal,那当前对象就是咱们要找的,直接返回 - 如果当前对象的
list里没有,就挨个遍历这个list里的每个子对象,递归调用同样的查找方法 - 只要递归调用返回了非空结果(说明在某个子分支里找到了),立刻把结果返回,别再继续遍历其他子对象了,省得做无用功
代码示例(以Java为例,适配ArrayList场景)
首先得有你的T类型类,假设咱们叫它Node(你可以改成自己的类名):
import java.util.ArrayList; public class Node<T> { private ArrayList<Node<T>> list; // 存储子对象的列表 private T value; // 可选:如果需要根据值判断目标,就加这个字段,不需要可以删掉 // 构造方法、getter/setter自己补一下哈,按需实现 public ArrayList<Node<T>> getList() { return list; } public void setList(ArrayList<Node<T>> list) { this.list = list; } public T getValue() { return value; } public void setValue(T value) { this.value = value; } }
然后是核心的查找方法:
public class NodeFinder { // 传入当前节点和目标节点,返回目标的父节点,没找到返回null public static <T> Node<T> findParentNode(Node<T> current, Node<T> goal) { // 先检查当前节点的子列表里有没有目标 if (current.getList() != null && current.getList().contains(goal)) { return current; } // 递归遍历每个子节点 if (current.getList() != null) { for (Node<T> child : current.getList()) { Node<T> result = findParentNode(child, goal); // 找到结果就直接返回,不用继续遍历 if (result != null) { return result; } } } // 所有分支都找过了没找到,返回null return null; } }
关键细节要注意
- 空指针防护:一定要先判断
current.getList()是不是null,不然直接调用contains或者遍历会炸空指针异常 - 对象匹配规则:如果你的
Node类没重写equals和hashCode方法,contains是按对象引用判断的——也就是说只有goal是list里的同一个实例才会匹配。如果你需要按值匹配(比如两个对象值相同就算找到),记得重写这两个方法 - 提前终止遍历:递归找到结果就立刻返回,避免遍历所有子节点,提升效率
测试用例示例
public static void main(String[] args) { // 构建一个测试层级 Node<String> root = new Node<>(); root.setList(new ArrayList<>()); Node<String> childNode = new Node<>(); childNode.setValue("子节点"); childNode.setList(new ArrayList<>()); Node<String> targetNode = new Node<>(); targetNode.setValue("目标节点"); childNode.getList().add(targetNode); root.getList().add(childNode); // 查找目标节点的父节点 Node<String> parent = NodeFinder.findParentNode(root, targetNode); if (parent != null) { System.out.println("找到父节点:" + parent.getValue()); // 输出「找到父节点:子节点」 } else { System.out.println("没找到目标节点的父节点"); } }
内容的提问来源于stack exchange,提问作者Justin Calareso
相关产品推荐
相关产品推荐

