0

ファイルを読み取って、各単語の後に特定の「2 つの単語」が続くかどうかを確認する必要があります。たとえば、Mr. John Smith です。そのため、ファイルを読んで Mr. という単語に直面しているときに、Mr. の後の 2 つの単語をチェックして、それらが "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 

これは、ファイルの最後の単語の後に 2 つの単語がないために発生しますか? 私の推測が正しければ、ファイルの最後の単語で停止できるようにするにはどうすれば修正できますか。私の推測が間違っている場合は、その理由を教えてください。注:これは私の問題を示す単なる例です

4

3 に答える 3

1

これは、ファイルの最後の単語の後に 2 つの単語がないために発生しますか。

はい、そうです。

私の推測が正しければ、ファイルの最後の単語で停止できるようにするにはどうすれば修正できますか。

最初に配列の長さを超えているかどうかを確認してください:

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

トークンを処理する前に、トークンが null かどうかを常に確認できます。処理を実行する前に、すべての変数/データ構造が有効であることを確認することをお勧めします。

于 2012-10-13T14:55:07.873 に答える