自定义拼写检查生成错误

时间:2014-10-28 12:17:49

标签: java indexoutofboundsexception spell-checking

我正在加载一个包含近80,000个单词的文件。它将用作主要拼写检查字典。单词的序列已被随机化。我正在加载另一个文件,其中包含我必须检查的拼写错误的单词。它还为错误拼写的单词提供建议。

public void spellCheckDocument(ArrayList<String> dictionary){
        long startCheck = System.currentTimeMillis();
        for(String words: collectionOfParagraphs)
            for(String word: words.split("[^a-zA-Z_0-9']+")){
                int index = Collections.binarySearch(dictionary, word.toLowerCase());
                if(index<0 && word.length()>0){

                    //collectionOfMisspelledWord.add(word+" Possible correct word: "+dictionary.get(-index+1)+" "+dictionary.get(-index)+" "+dictionary.get(-index-1));
                    //System.out.printf("%s Misspelled, possible correct words: %s, %s, %s\n", word, dictionary.get(-index+1),dictionary.get(-index),dictionary.get(-index-1));
                    possibleCorrectSpellings = new Document(word, dictionary.get(-index+1),dictionary.get(-index), dictionary.get(-index-1));
                    collectionOfMisspelledWord.add(possibleCorrectSpellings);
                }           
        }

--------error----------
java.lang.IndexOutOfBoundsException: Index: 380, Size: 379
    at java.util.ArrayList.rangeCheck(ArrayList.java:653)
    at java.util.ArrayList.get(ArrayList.java:429)
    at file.Document.spellCheckDocument(Document.java:82)

1 个答案:

答案 0 :(得分:0)

来自Collections.binarySearch()的文档:

  

否则,(-(insertion point) - 1)插入点定义为将密钥插入列表的点:第一个元素的索引大于键,如果列表中的所有元素都是list.size()小于指定的密钥。

这意味着您有时会得到一个超过列表中最后一个元素的索引。您需要为此案例添加特殊处理(这可能意味着您不知道哪些单词可能正确)。