Java邻接列表输出时第二个节点后出现空白的原因排查
Java邻接列表打印时出现空白节点的原因及修复
我仔细分析了你的代码和问题描述,找到了导致打印时出现空白的核心原因,同时给出对应的修复方案:
问题根源
问题出在Graph构造函数中第一个用于读取顶点的Scanner配置:
fileScanner.useDelimiter("[^A-Za-z0-9]");
这个正则表达式的作用是将单个非字母数字字符作为分隔符,这会导致两种情况生成空字符串:
- 输入文件开头/结尾存在非字母数字字符(比如换行符),
Scanner会读取到分隔符前后的空内容; - 输入中出现连续的非字母数字字符(比如多个空格、标点组合),分隔符之间的内容为空。
而你的代码没有对空字符串做过滤,直接将其添加到了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
相关产品推荐
相关产品推荐

