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

Java邻接列表输出时第二个节点后出现空白的原因排查

Java邻接列表打印时出现空白节点的原因及修复

我仔细分析了你的代码和问题描述,找到了导致打印时出现空白的核心原因,同时给出对应的修复方案:

问题根源

问题出在Graph构造函数中第一个用于读取顶点的Scanner配置:

fileScanner.useDelimiter("[^A-Za-z0-9]");

这个正则表达式的作用是将单个非字母数字字符作为分隔符,这会导致两种情况生成空字符串:

  1. 输入文件开头/结尾存在非字母数字字符(比如换行符),Scanner会读取到分隔符前后的空内容;
  2. 输入中出现连续的非字母数字字符(比如多个空格、标点组合),分隔符之间的内容为空。

而你的代码没有对空字符串做过滤,直接将其添加到了words列表中:

if (!words.contains(nextWord)) { 
    words.add(nextWord); 
}

这就导致adjLists数组中多了一个名字为空的顶点。当邻接列表中存在指向这个空顶点的边,或者打印这个空顶点本身时,就会出现你看到的-->空白部分。

修复方案

你可以通过两种方式解决这个问题:

方案1:过滤空字符串

在将单词添加到words列表前,先判断是否为空字符串:

while (fileScanner.hasNext()) {
    String nextWord = fileScanner.next();
    // 只添加非空的唯一单词
    if (!nextWord.isEmpty() && !words.contains(nextWord)) {
        words.add(nextWord);
    }
}

方案2:优化分隔符正则

使用\\W+匹配连续的非单词字符(等价于[^A-Za-z0-9_]+,如果你的顶点名称不包含下划线,这个完全适用),这样即使有连续的分隔符,也不会生成空字符串:

fileScanner.useDelimiter("\\W+");

修改后,Scanner会自动跳过连续的非字母数字字符,只返回有效的顶点名称,从根源上避免空字符串的产生。

额外优化建议

另外,你的print方法中使用System.out.println("\n")会打印两个换行符(println本身会追加一个换行),如果不需要额外的空行,可以改成System.out.println();,让输出更整洁。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:24:55