0

我需要阅读一个文件并检查每个单词后面是否有某些“两个单词”,例如,John Smith 先生。所以,当我阅读文件时,我面对 Mr. 这个词,我应该检查 Mr. 后面的两个词,看看它们是否是“John Smith”,并计算发生了多少次。我写了以下程序

    BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream  ("TestF.txt"));
String line=reader.readLine();
    HashMap<String, Integer> wordCount = new HashMap<String, Integer>();

    while(line!=null)
    {
        String[] tokens= line.split(" ");
        for (int i=0; i<tokens.length; i++)
        {
                 if tokens[i].equals("Mr.")
                         {              

            if(!(tokens[i+1].isEmpty()))
            {
                if (tokens[i+1].equlas("John")
                                       String s= "John";
                                     else 
                                        s= "Other Name";
            }
            else
                        s="";
        if(!(tokens[i+2].isEmpty()))
            {
                 if (tokens[i+1].equlas("Smith")
                              String s2= "Smith";
                          else 
                              s2= "Other Name";                 
            }
            else
                      s2="";
            if (s.equals("John")&&s2.equals("Smith"))
            {
           if (wordCount.containsKey(tokens[i]))
                wordCount.put(tokens[i], wordCount.get(tokens[i]).intValue()+1);
        else
              wordCount.put(tokens[i], 1);
            }


                       }
        // Go to the next line
        line=reader.readLine();
    }

以下行有问题

if(!(tokens[i+1].isEmpty()))

if(!(tokens[i+2].isEmpty()))实际上它说:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 26 

是否因为文件中的最后一个单词后面没有两个单词而发生这种情况?如果我的猜测是正确的,我该如何纠正它,以便我可以在文件的最后一个单词中停下来。如果我的猜测是错误的,请告诉我原因。注意:这只是显示我的问题的示例

4

3 回答 3

1

是否因为文件中的最后一个单词后面没有两个单词而发生这种情况。

对,那是正确的。

如果我的猜测是正确的,我该如何纠正它,以便我可以在文件的最后一个单词中停下来。

只需首先检查您是否超过了数组的长度:

if ((i + 1) < tokens.length && !(tokens[i+1].isEmpty()))
于 2012-10-13T14:53:04.957 回答
1

是的,这可能就是问题所在。只需将循环设置为tokens.length-2如下所示:

for(i=0; i < tokens.length - 2; i++) {
   ...
}
于 2012-10-13T14:56:44.137 回答
0

您总是可以在处理之前检查令牌是否为空,在对它执行任何处理之前确保所有变量/数据结构都有效是一个很好的做法。

于 2012-10-13T14:55:07.873 回答