2015-04-06 110 views
-1

我正在使用isLetter()和charAt()來查看str中的字符是否是字母。 此方法的用途是查找字符串中至少包含最小字長的字數。我不想讓它算數字以外的任何東西。 (im java noob)Java確定字符串中的每個字符是否是字母

public static int wordCount(String str, int minLength) {  
//Method that counts words. 

    int count = 0; 
    boolean isLetter = false; 
    for (int i = 0, wordLength = 0; i < str.length() + 1; i++) { 
     isLetter = Character.isLetter(str.charAt(i)); //Why doesn't this line work? 
     if (i == str.length() || str.charAt(i) == ' ' || isLetter==false) { 
      if (wordLength >= minLength) {    
       count++;             
      } 
      wordLength = 0;         
     } else {                
      wordLength++;          
     } 
    } 
    return count; 
} 
+0

isLetter檢查不起作用嗎?它用在一個複合謂詞中,它與一堆其他條件進行或運算...... –

+0

它說「線程中的異常」主「java.lang.StringIndexOutOfBoundsException:字符串索引超出範圍:4」 – Seiji

回答

2

問題出在您的for循環中。你有它迭代,直到i < str.length() + 1。這意味着在某些時候,你會要求str.charAct(str.length())。由於Java數組(和字符串)索引從0開始,索引太高並且會中斷。

取而代之,只需要您的for循環迭代,直到i < str.length()。這應該解決它。

2

這不是Character.isLetter不能正常工作,而是當i達到str.length()時拋出異常的str.charAt(i)

你的循環迭代i0str.length(),包括 - 總共str.length()+1個字符。撥打charAt(i)istr.length()將是非法的。

要解決這個問題,從表達中for循環刪除+ 1,或確保當i等於str.length()str.charAt(i)不叫。例如,你可以使用短路的功能是這樣的:

for (int i = 0, wordLength = 0; i < str.length() + 1; i++) { 
    if (i == str.length() || !Character.isLetter(str.charAt(i))) { 
     ... 
    } 
} 

以上,str.charAt(i)不叫時i == str.length(),防止碰撞(demo)。

你可能想改變一些事情:

  • str.charAt(i) == ' ' || isLetter==false可以降低到isLetter==false甚至!isLetter,因爲空格字符是
  • isLetter聲明可以移動在循環內部,並結合初始化(除非你決定使用上面顯示的代碼完全去掉變量)。
+0

代碼現在運行刪除+1後,它仍然將標點作爲一個單詞來計算,我該怎麼辦? – Seiji

+0

@javajavahut它不計算標點符號(你可以看到我的修改[這裏](http://ideone.com/rFOrN1))。 – dasblinkenlight

+0

非常感謝! – Seiji

相關問題