求助:排查furthestAirport方法返回空ArrayList的问题
furthestAirport方法返回空列表的问题 我先仔细捋了一遍你的代码,这里有几个关键问题可能导致方法返回空ArrayList,咱们一个个拆解来看:
初始
max值设置不合理
你把max初始化为2,但如果从出发机场到所有可达目的地的最短路径顶点数(也就是temp.size())都没法达到或超过这个值,max就永远不会更新,后续的筛选逻辑自然找不到符合条件的目的地。比如如果所有可达目的地都是直连(路径顶点数刚好是2),这没问题,但如果所有其他机场都不可达(shortestPaths返回空集合),那tempList会一直为空,最终result也为空。路径长度的计算可能和你的预期不符
你用temp.size()作为路径长度,但这里的size()是路径里的顶点数量。如果你的“最远”是指中转的边数(比如直连是1条边,中转一次是2条边),那你应该用temp.size() - 1来计算。如果搞混了顶点数和边数的逻辑,会导致max的判断完全错误,进而筛选不出正确的目的地。stationKeys的完整性存疑
你遍历的stationKeys是不是包含了所有的机场顶点?如果这个集合本身为空,或者漏掉了某些可达的目的地机场,那循环根本不会处理这些目标,自然不会有结果加入result。双循环逻辑的冗余与潜在问题
你的代码分两次遍历stationKeys,第一次收集可能符合条件的endKey,第二次再筛选。但第一次循环中,当max被更新为更大的值时,tempList里之前的endKey其实已经不符合新的max了,但你没有清空tempList——虽然这不会影响最终结果,但会降低效率。更关键的是,如果初始max设置过大,所有路径长度都小于它,那tempList会一直为空,result也跟着为空。
修复建议
针对这些问题,你可以做以下调整,优化后的逻辑更简洁高效:
static ArrayList<Integer> furthestAirport(int departingAirport) { // 初始化max为0,确保第一条可达路径就能触发更新 int maxPathLength = 0; ArrayList<Integer> result = new ArrayList<>(); for (int endKey : stationKeys) { if (departingAirport == endKey) { continue; // 跳过出发机场本身 } HashSet<ArrayList<Integer>> shortestPaths = g.shortestPaths(departingAirport, endKey); if (shortestPaths.isEmpty()) { continue; // 跳过不可达的目的地 } // 取任意一条最短路径的长度(所有最短路径长度一致) int pathLength = shortestPaths.iterator().next().size(); // 如果要统计边数,改成 pathLength - 1 if (pathLength > maxPathLength) { // 找到更长的路径,更新max并重置结果列表 maxPathLength = pathLength; result.clear(); result.add(endKey); } else if (pathLength == maxPathLength) { // 长度相同,去重后加入结果 if (!result.contains(endKey)) { result.add(endKey); } } } return result; }
另外,你可以在循环里加些调试输出,比如打印每个endKey的路径长度、shortestPaths是否为空,这样能更快定位到底是目的地不可达,还是长度判断出了问题。
内容的提问来源于stack exchange,提问作者farawn

