You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Java实现诗歌与词典拼写错误检测:嵌套循环遍历问题求解

解决拼写错误词汇检测的代码问题

嘿,我来帮你搞定这个嵌套循环的问题,顺便修复代码里的几个关键bug~

先说说你代码里的两个核心问题

  • 词典读取错误:你在读取词典文件后,写了String dictionary2 = new String(buffer);,这里应该用buffer2才对!不然你拿到的词典内容其实还是诗歌的内容,完全起不到对比的作用。
  • 嵌套循环逻辑颠倒:你现在的写法是遍历每个词典词,再遍历每个诗歌词,只要两者不等就输出诗歌词——这会导致正确的词被反复输出(比如一个正确的词会和所有词典里不等于它的词对比,每次都输出)。正确的逻辑应该是:对每个诗歌词,检查它是否在词典中不存在,如果不存在,才是拼写错误的词汇。

优化后的代码实现

我把代码改成了更高效的方式(用HashSet存储词典单词,查找效率更高),同时修复了文件读取的问题:

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

public class SpellChecker {
    public static void findMisspelledWords(String poemPath, String dictionaryPath) throws IOException {
        // 1. 读取词典文件,存入Set(方便快速查找)
        Set<String> dictionaryWords = new HashSet<>();
        try (BufferedReader dictReader = new BufferedReader(new FileReader(dictionaryPath))) {
            String line;
            // 逐行读取词典,分割单词(如果词典是每行一个词,就直接add(line.trim()))
            while ((line = dictReader.readLine()) != null) {
                String[] words = line.trim().split(" ");
                for (String word : words) {
                    dictionaryWords.add(word.trim());
                }
            }
        } catch (IOException e) {
            System.err.println("读取词典文件出错:" + e.getMessage());
            throw e;
        }

        // 2. 读取诗歌文件,分割单词
        StringBuilder misspelled = new StringBuilder();
        try (BufferedReader poemReader = new BufferedReader(new FileReader(poemPath))) {
            String line;
            while ((line = poemReader.readLine()) != null) {
                // 分割诗歌里的单词,这里可以根据实际情况调整分割规则(比如处理标点)
                String[] poemWords = line.trim().split(" ");
                for (String word : poemWords) {
                    // 清理单词可能带的标点(比如逗号、句号,可选步骤)
                    String cleanedWord = word.replaceAll("[^a-zA-Z]", "").toLowerCase();
                    // 检查是否不在词典中
                    if (!cleanedWord.isEmpty() && !dictionaryWords.contains(cleanedWord)) {
                        misspelled.append(word).append("\n");
                        System.out.println("拼写错误的词汇:" + word);
                    }
                }
            }
        } catch (IOException e) {
            System.err.println("读取诗歌文件出错:" + e.getMessage());
            throw e;
        }

        // 如果需要返回错误词汇字符串,取消下面注释即可
        // return misspelled.toString();
    }

    public static void main(String[] args) {
        try {
            findMisspelledWords("poem.txt", "dictionary.txt");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

代码说明

  • 用HashSet存储词典HashSetcontains()方法是O(1)的时间复杂度,比嵌套循环的O(n*m)高效太多,尤其是当词典很大的时候。
  • 资源自动关闭:用try-with-resources语法,不需要手动关闭BufferedReader,Java会自动处理,避免资源泄漏。
  • 可选的单词清理:添加了清理标点和转小写的逻辑,因为诗歌里的单词可能带逗号、句号,或者大小写不一致,这样能更准确地对比。
  • 逻辑修正:现在是遍历每个诗歌词,检查是否在词典中不存在,只输出真正拼写错误的词汇。

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

火山引擎 最新活动