8.10同义词库实验输出异常:缺失civilize的问题排查咨询
问题分析与修复
实验要求
给定一组包含不同单词同义词的文本文件,完成主程序以输出特定单词的同义词。每个文本文件的名称对应目标单词,文件内每行存储以同一字母开头的同义词,用空格分隔。程序需读取用户输入的单词和字母,打开对应文本文件,将内容存入预定义的二维数组,最后查找并输出所有以输入字母开头的同义词(每行一个),若无则输出提示信息。提示:利用ASCII值将单词首字母映射为数组行索引(如'a'对应0,'z'对应25),假设所有字母为小写。
示例:输入educate c时,打开educate.txt应输出civilize、coach、cultivate;输入educate a时输出无同义词提示。
问题现象
输入educate c时,程序仅输出coach和cultivate,缺失civilize。
代码与文本文件
Java代码
import java.util.Scanner; import java.io.FileInputStream; import java.io.IOException; public class LabProgram { public static void main(String[] args) throws IOException { Scanner scnr = new Scanner(System.in); int NUM_CHARACTERS = 26; int MAX_WORDS = 10; String[][] synonyms = new String[NUM_CHARACTERS][MAX_WORDS]; String[] words; String word = scnr.next(); char letter = scnr.next().charAt(0); FileInputStream fileByteStream = new FileInputStream(word + ".txt"); Scanner fileScanner = new Scanner(fileByteStream); for (int i = 0; i < NUM_CHARACTERS; i++) { for (int j = 0; j < MAX_WORDS; j++) { synonyms[i][j] = ""; } } while (fileScanner.hasNextLine()) { String line = fileScanner.nextLine(); words = line.split(" "); char firstLetter = words[0].charAt(0); int index = firstLetter - 'a'; for (int i = 1; i < words.length; i++) { synonyms[index][i - 1] = words[i]; } } int index = letter - 'a'; boolean found = false; for (String synonym : synonyms[index]) { if (!synonym.isEmpty()) { System.out.println(synonym); found = true; } } if (!found) { System.out.println("No synonyms for " + word + " begin with " + letter + "."); } fileScanner.close(); } }
相关文本文件
happy.txt
blessed blest blissful cheerful contented delighted ecstatic elated glad joyful joyous jubilant lively merry overjoyed peaceful pleasant pleased thrilled upbeat
goal.txt
objective
educate.txt
brainwash brief civilize coach cultivate develop discipline drill edify enlighten exercise explain foster improve indoctrinate inform instruct mature nurture rear school train tutor
错误原因
问题出在读取文件行的循环逻辑中:
for (int i = 1; i < words.length; i++) { synonyms[index][i - 1] = words[i]; }
这段代码从i=1开始遍历拆分后的单词数组,只存储了words[1]及之后的元素,但每行的第一个单词(如civilize)本身也是同义词,被代码遗漏了。
以educate.txt中c开头的行为例,拆分后的words数组是["civilize", "coach", "cultivate"],代码只把coach和cultivate存入了数组,漏掉了第一个元素civilize。
修复方案
将存储同义词的循环起始索引改为0,同时调整数组存储的索引位置:
for (int i = 0; i < words.length; i++) { synonyms[index][i] = words[i]; }
这样就能把每行所有的同义词(包括第一个单词)都存入二维数组,输入educate c时就能正确输出civilize、coach、cultivate三个词。
内容的提问来源于stack exchange,提问作者Corey Saunders
相关产品推荐
相关产品推荐

