public int countYZ(String str) {
int count = 0;
for(int i = 0;i<str.length();i++)
if((str.charAt(i)=='y'||str.charAt(i)=='z')&&!(Character.isLetter(i+1)))
count++;
return count;
}
此代码未通过此条件的测试:给定一个字符串,计算结束于&#39; y&#39;或者&#39; z&#39; - 所以&#39; y&#39; in&#34; heavy&#34;而且&#39; z&#39;在&#34; fez&#34;伯爵,但不是&#39; y&#39; in&#34; yellow&#34; (不区分大小写)。如果没有紧跟在它后面的字母,我们会说y或z位于单词的末尾。 (注意:Character.isLetter(char)测试char是否为字母。)
我手工跟踪它,似乎无法弄清楚为什么它不能用于许多测试。例如,在&#34; day fyyyz&#34;它输出5但它应该返回2.感谢帮助!
答案 0 :(得分:1)
需要考虑两件事:
正如UnholySheep所指出的,Character.isLetter(i+1)
没有检查字符串中的i+1
字符。您需要使用:
Character.isLetter(str.charAt(i+1))
但只是更改它会产生IndexOutOfBoundsException
,因为如果字符串以y
或z
结尾,则会超出字符串的结尾。因此,将条件的第二位更改为
!(i+1 != str.length() && Character.isLetter(str.charAt(i+1)))
这也会计算字符串末尾的y
或z
。
当然,这可以写成:
i+1 == str.length() || !Character.isLetter(str.charAt(i+1))
这有点不太尴尬。
总体情况:
if((str.charAt(i) == 'y' || str.charAt(i) == 'z')
&& (i+1 == str.length() || !Character.isLetter(str.charAt(i+1)))
如果您想使其不区分大小写,请在与Character.toLowerCase(str.charAt(i))
和y
进行比较之前使用z
。
答案 1 :(得分:0)
使用正则表达式很容易解决这个问题:
String str = "day fyyyz provaz provy drad";
Matcher matcher = Pattern.compile("(?i)\\b\\w+[zy]\\b").matcher(str);
int i = 0;
while (matcher.find()) {
System.out.println(matcher.group());
i++;
}
System.out.println("found " + i);
此代码将输出:
day
fyyyz
provaz
provy
found 4
此正则表达式(?i)\\b\\w+[zy]\\b
表示:
(?i)
启用匹配大小写不敏感\b
匹配字边界\w+
匹配一个或多个单词字符(等于[a-zA-Z0-9 _])[zy]
匹配[zy] \b
匹配字边界答案 2 :(得分:0)
您的函数返回字符串中y
和z
字符的总数,而不是y
或{{1}中结尾的字数}}。 z
是一个正则表达式标记,用于定位字符串中的任何非单词字符。
\\W