我正在使用isLetter()和charAt()来查看str中的字符是否是字母。 使用此方法是查找字符串中至少为最小字长的字数。我不希望它除了字母之外还要算什么。 (我是一个java noob)
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 :(得分:2)
问题出在你的for
循环中。你有迭代直到i < str.length() + 1
。这意味着在某些时候,你会要求str.charAct(str.length())
。因为Java数组(和字符串)从0开始索引,所以索引太高而且会破坏。
相反,只需让for
循环迭代到i < str.length()
。那应该解决它。
答案 1 :(得分:2)
Character.isLetter
无法正常工作,str.charAt(i)
在i
到达str.length()
时会引发异常。
您的循环将i
从0
迭代到str.length()
,包括总共str.length()+1
个字符。 <{1}} charAt(i)
i
时str.length()
的来电是非法的。
要解决此问题,请从+ 1
循环中的表达式中删除for
,或确保在str.charAt(i)
等于{{1}时未调用i
}}。例如,您可以使用如下的短路功能:
str.length()
以上,for (int i = 0, wordLength = 0; i < str.length() + 1; i++) {
if (i == str.length() || !Character.isLetter(str.charAt(i))) {
...
}
}
时未调用str.charAt(i)
,以防止崩溃(demo)。
您可能想要更改一些内容:
i == str.length()
可以缩减为str.charAt(i) == ' ' || isLetter==false
甚至缩小为isLetter==false
,因为空格字符不是字母!isLetter
的声明可以在循环中移动,并与初始化相结合(除非您决定使用上面显示的代码剪切完全删除变量)。