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

如何从Map中获取指定父节点的所有层级子节点?去重问题求助

解决递归获取所有父节点的重复问题

原代码的问题出在递归逻辑混乱,导致节点被重复添加,还错误地把目标节点本身也放进了结果里。具体问题点:

  • 递归调用后既添加返回的子列表,又手动添加当前父节点,同一节点被多次插入
  • 最后把目标节点(比如fc)也加入了结果,不符合“获取所有父节点”的需求
  • 终止条件返回空列表,会让上层无意义地添加空集合

下面是修正后的代码,同时加入去重逻辑(避免循环依赖或重复路径导致的重复节点):

import java.util.*;

public class ParentResolver {
    public static Map<String, List<String>> childParentMap = new HashMap<>();

    public static List<String> immediateParents(String key) {
        return childParentMap.getOrDefault(key, Collections.emptyList());
    }

    public static List<String> getAllParents(String key) {
        // 使用LinkedHashSet保证顺序且去重
        Set<String> parentSet = new LinkedHashSet<>();
        collectAllParents(key, parentSet);
        return new ArrayList<>(parentSet);
    }

    private static void collectAllParents(String key, Set<String> parentSet) {
        List<String> immediateParents = childParentMap.get(key);
        if (immediateParents == null || immediateParents.isEmpty()) {
            return;
        }
        for (String parent : immediateParents) {
            // 先递归处理上层父节点,再添加当前父节点,保证顺序是[m, n, x, y]
            collectAllParents(parent, parentSet);
            parentSet.add(parent);
        }
    }

    public static void main(String[] args) {
        childParentMap.put("fc", Arrays.asList("x", "y"));
        childParentMap.put("x", Arrays.asList("m", "n"));

        String key = "fc";
        List<String> res = getAllParents(key);
        System.out.println(res); // 输出 [m, n, x, y]
    }
}

修改说明:

  1. 拆分递归逻辑:用私有方法collectAllParents负责递归收集,主方法getAllParents初始化去重集合,避免原方法中参数传递列表导致的混乱
  2. 使用LinkedHashSet:既保证节点的添加顺序,又自动去重,彻底解决重复问题
  3. 移除目标节点的添加操作:结果只包含所有层级的父节点
  4. 调整递归顺序:先递归处理上层父节点,再添加当前父节点,严格符合需求的[m, n, x, y]顺序
  5. 优化终止条件:没有父节点时直接返回,不做多余操作

内容的提问来源于stack exchange,提问作者man123

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 09:43:20