繁体   English   中英

Java确定字符串中的每个字符是否为字母

[英]Java determining if each character in a string is a letter

我正在使用isLetter()和charAt()来查看str中的字符是否是字母。 此方法的用途是查找字符串中至少等于最小单词长度的单词数。 除了字母,我不希望它计数任何其他东西。 (我是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;
}

问题出在您的for循环中。 您需要迭代直到i < str.length() + 1为止。 这意味着在某个时候,您会要求提供str.charAct(str.length()) 因为Java数组(和字符串)的索引从0开始,所以索引太高并且会中断。

相反,只需让for循环迭代直到i < str.length() 那应该解决它。

不是Character.isLetter无法正常工作,而是当i达到str.length()时, str.charAt(i)引发异常。

您的循环将i0迭代到str.length() (包括str.length() -总共str.length()+1字符。 istr.length()时,调用charAt(i) str.length()将是非法的。

要解决此问题,请从for循环的表达式中删除+ 1 ,或确保当i等于str.length()时不调用str.charAt(i) str.length() 例如,您可以使用以下短路功能:

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

上面,当i == str.length()时不调用str.charAt(i) ,以防止崩溃( demo )。

您可能需要更改一些其他内容:

  • str.charAt(i) == ' ' || isLetter==false str.charAt(i) == ' ' || isLetter==false可以简化为isLetter==false甚至可以简化为!isLetter ,因为空格字符不是字母
  • 可以在循环内移动isLetter的声明,并将其与初始化结合使用(除非您决定使用上面显示的代码完全isLetter该变量)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM