Java树形结构遍历困惑:按类型查找Department列表的实现问题
树形结构按类型查找Department的递归实现方案
完全可以通过接口的默认方法getMatchingDepartment实现全树遍历查找,核心是正确运用递归逻辑——处理当前节点+递归遍历所有子节点并合并结果。
接口结构与递归实现示例
先规范接口的核心方法(必须包含获取子节点的方法,否则无法遍历):
import java.util.ArrayList; import java.util.List; public interface Department { // 获取当前节点的所有子节点(Company作为子类,子节点也属于Department类型) List<Department> getChildren(); // 默认方法:递归查找所有匹配目标类型的节点 default List<Department> getMatchingDepartment(Class<?> targetType) { List<Department> matched = new ArrayList<>(); // 1. 检查当前节点是否匹配目标类型 if (targetType.isInstance(this)) { matched.add(this); } // 2. 递归遍历所有子节点,合并子节点的匹配结果 List<Department> children = getChildren(); if (children != null && !children.isEmpty()) { for (Department child : children) { matched.addAll(child.getMatchingDepartment(targetType)); } } return matched; } } // Company继承Department,自动继承默认方法 public interface Company extends Department { // 可添加Company专属方法,不影响遍历逻辑 }
关键注意点
- 递归逻辑完整性:之前没遍历所有子元素,大概率是只处理了当前节点或第一层子节点,遗漏了对子节点的递归调用。必须确保每个子节点都触发
getMatchingDepartment,并将结果合并到当前列表。 - 空指针防护:如果
getChildren()可能返回null或空列表,必须加判断避免异常。 - 类型匹配方式:
- 用
targetType.isInstance(this):匹配当前节点及所有子类节点(比如传入Department.class会返回所有节点,传入Company.class会返回所有Company类型节点)。 - 若需精确匹配类型(不包含子类),替换为
this.getClass().equals(targetType)。
- 用
使用示例
假设你有一个根节点(比如Company实例),调用方式如下:
// 查找所有Company类型的节点 List<Department> companies = root.getMatchingDepartment(Company.class); // 查找所有Department类型的节点(全树节点) List<Department> allDepartments = root.getMatchingDepartment(Department.class);
内容的提问来源于stack exchange,提问作者wesky77
相关产品推荐
相关产品推荐

