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

Java程序开发问题:实现跨文件字符串搜索并输出未匹配项

问题分析与修复方案

你的代码现在有几个关键问题导致搜索功能失效,咱们一个个拆解来看:

1. 只读取了字典文件的第一行

你在初始化时只调用了一次eng_dict.readLine(),之后整个循环里再也没读取file2.txt的后续内容——这意味着你永远只在用file2的第一行文本去匹配所有file1里的单词,显然没法完成全文件搜索。

2. 循环逻辑顺序混乱,存在空指针风险

你在循环里先打印当前spelling_word,立刻读取下一个单词,再用这个新单词做匹配判断。这里有两个问题:

  • 第一次循环时,你先打印初始读取的单词,接着读下一个,如果file1只有一行,spelling_word会变成null,调用contains()时直接抛出空指针异常。
  • 匹配判断的时机完全错了,应该先对当前读取的单词完成匹配,再读取下一个。

3. 匹配逻辑不符合需求

你写的eng_dict_word.contains(spelling_word)是判断字典的某一行是否包含当前单词,但从你的例子来看,你需要的是精确匹配("Homee"和"Home"是不同的单词,应判定为未匹配),这个逻辑显然不适用。


修正后的代码

我给你调整了逻辑,用集合存储字典内容提升匹配效率,同时修复了所有问题:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashSet;
import java.util.Set;

public class WordSearcher {
    public static void main(String[] args) {
        // 先把file2的所有单词加载到集合,匹配效率更高
        Set<String> dictionary = new HashSet<>();
        
        // 用try-with-resources自动关闭流,避免资源泄漏
        try (BufferedReader engDictReader = new BufferedReader(new FileReader("file2.txt"))) {
            String line;
            while ((line = engDictReader.readLine()) != null) {
                // 去掉前后空格,避免换行符/空格导致的匹配失败
                dictionary.add(line.trim());
            }
        } catch (IOException e) {
            System.err.println("读取字典文件出错:" + e.getMessage());
            return;
        }
        
        // 读取file1并逐一匹配
        try (BufferedReader wordListReader = new BufferedReader(new FileReader("file1.txt"))) {
            String spellingWord;
            while ((spellingWord = wordListReader.readLine()) != null) {
                String cleanedWord = spellingWord.trim();
                if (cleanedWord.isEmpty()) {
                    continue; // 跳过空行
                }
                
                if (dictionary.contains(cleanedWord)) {
                    System.out.println("Word found: " + cleanedWord);
                } else {
                    System.out.println("Word not found: " + cleanedWord);
                    // 这里可以把未找到的单词写入文件或做其他处理
                }
            }
        } catch (IOException e) {
            System.err.println("读取单词列表文件出错:" + e.getMessage());
        }
    }
}

关键修改说明

  • 用HashSet存储字典:把file2的所有单词一次性加载到集合中,每次匹配的时间复杂度是O(1),比反复读取文件高效得多,尤其是字典文件较大时。
  • try-with-resources语法:无需手动关闭流,Java会自动处理,避免资源泄漏问题。
  • 修正循环逻辑:先读取单词再做匹配,彻底避免空指针和顺序混乱的问题。
  • 内容清理:用trim()去掉单词前后的空格/换行符,避免因格式问题导致的匹配失败,同时跳过空行。
  • 友好的错误提示:把生硬的堆栈跟踪改成易读的错误信息,方便排查问题。

用这个代码测试你的例子:file1的"Homee"不在file2的"Home"集合里,会输出Word not found: Homee,完全符合你的预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:59:10