2015-04-06 107 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

相关问题