You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 16:20:28