2016-10-21 20 views
-1

私のAP Computer Scienceクラスでは、文字列(この場合は常にツイートです)を入力してcharlimitに合致するかどうかを確認する必要がありますそれがretweetであるかどうかを確認し、ハッシュタグとメンションを数えます。私はこれをすべて考え出しましたが、ハッシュタグや言及をカウントするためには、スペースやそれに続くリターンはないはずです。 - 私はそれがあろうと期待して数値を使用特定の文字列をスキャンして数えます

for(int i=0; i < tweetLength; i++) { 
    if((tweet.charAt(i) == '@')&&((tweet.charAt(i+1) != 0)||(tweet.charAt(i+1) != 32)||(tweet.charAt(i+1) != 13))) { 
     countMentions++; 

    } if((tweet.charAt(i) == '#')&&((tweet.charAt(i+1) != 0)||(tweet.charAt(i+1) != 32)||(tweet.charAt(i+1) != 13))) { 
     countHashtags++; 

    } if(((tweet.charAt(i) == 'R')||(tweet.charAt(i) == 'r'))&&((tweet.charAt(i + 1) == 'T')||(tweet.charAt(i + 1) == 't'))&&(tweet.charAt(i + 2) == ':')) { 
     retweet = true; 
    } 
} 

は注意、32、13、0はスペース、リターン、およびヌル(私が思うに、笑)のASCII値です:私の現在のソリューションはこれです奇妙なことに私の問題を解決しますが、残念ながら、それはありませんでした。

それはすべて正常に動作しますが、アンパサンドまたは文字列の最後にハッシュ記号がある場合、それは、このエラーを返します。

java.lang.StringIndexOutOfBoundsException: String index out of range: 1 
     at java.lang.String.charAt(String.java:686) 
     at Main.main(Main.java:21) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
     at java.lang.reflect.Method.invoke(Method.java:597) 
     at edu.rice.cs.drjava.model.compiler.JavacCompiler.runCommand(JavacCompiler.java:272) 

が、私はそれがあるので、これが原因とされていることを知っていますnullを読み込もうとしていますが、私は本当に解決策を見つけることができません。先生は "ビデオ経由で教える"のようです。

+0

'tweet.charAt(i + 1)' - これは文字列の最後にあるときに壊れます。 –

+0

個人的には、これを解決するために正規表現を使用したいと思います(ただし、学校/大学の割り当てと同じように禁止されています)。ここでは 'i + 1'があなたの文字列の範囲内にあるかどうか最初にチェックする必要があります – UnholySheep

答えて

1

文字列内の文字を反復するときに境界の外側に移動しないように注意する必要があります。

for(int i=0; i < tweetLength; i++) 
    { 
     if (i + 1 == tweetLength) 
     { 
      // avoid going out of bounds 
      // when i == last char of the string 
      break; 
     } 

     if (tweet.charAt(i) == '@') 
      countMentions++; 

     if (tweet.charAt(i) == '#') 
      countHashtags++; 

     if (i + 2 < tweetLength) 
     { 
      // search for i+2 only when 
      // i+2 is not outside of the string 
      if (((tweet.charAt(i) == 'R') || (tweet.charAt(i) == 'r')) && 
        ((tweet.charAt(i + 1) == 'T') || (tweet.charAt(i + 1) == 't')) && 
        (tweet.charAt(i + 2) == ':')) 
      { 
       retweet = true; 
      } 
     } 
    } 

をあなたは私たちが最後の文字の上に配置されている場合、ループを終了するには、break文を追加しました見ることができるように:あなたが失敗しないのcharAt(i)を確保することによって、これを達成することができます。また、最後の文字は「:」、最後の文字は「:」をチェックしません。

私はあなたが考えを得ることを願っていますが、ちょうど参考のコード "すべての問題はありません"です。テストしていないコーナーケースがいくつかあります(「a b#c」など)。これは有効なハッシュタグではないため、ハッシュタグ記号の後に有効な文字が来るようにする必要があります。おそらく "#@ abc"のようなものがあるかもしれませんが、あなたは何とか正しい軌道に乗っているので、あなたの任務をあなたに任せて、あなたのためにやってはいけません。今、私はあなたがこのようのためにあなたのを修正について考え、ロジックを理解してきました期待していること

public char charAt(int index) { 
    if ((index < 0) || (index >= value.length)) { 
     throw new StringIndexOutOfBoundsException(index); 
    } 
    return value[index]; 
} 

:あなたはより良い例外はそれをスローするコードを見てスローされた理由を理解したい場合は

for(int i=0; i < tweetLength - 1; i++) 

場合、最初の除去。とにかく、もっと複雑なやり方でやっていますよね? :)

関連する問題