我正在加载一个包含近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)
答案 0 :(得分:0)
来自Collections.binarySearch()的文档:
否则,
(-(insertion point) - 1)
。 插入点定义为将密钥插入列表的点:第一个元素的索引大于键,如果列表中的所有元素都是list.size()小于指定的密钥。
这意味着您有时会得到一个超过列表中最后一个元素的索引。您需要为此案例添加特殊处理(这可能意味着您不知道哪些单词可能正确)。