此方法moreVowels旨在计算输入的字符串中的元音和辅音的数量,如果元音的数量大于辅音的数量,则返回true。可悲的是,这段代码总是返回false,我无法理解为什么。这是所说的方法:
public Boolean moreVowels()
{ vowelCount = 0;
consonantCount = 0;
for(int i = 0; i < word.length(); i++)
{
if ("AEOIUY".contains(word.substring(i,i++)) || "aeoiuy".contains(word.substring(i,i++)))
{
vowelCount++;
}
if ("BCDFGHJKLMNPQRSTVWXZ".contains(word.substring(i,i++)) || "abcdefghijklmnopqrstuvwxyz".contains(word.substring(i,i++)))
{
consonantCount++;
}
}
if (vowelCount > consonantCount)
{
return true;
}
else
{
return false;
}
}
我认为由于循环没有实际增加计数,它总是返回错误,但我不太清楚为什么不这样做。感谢您阅读,我确定答案是愚蠢的,我没有认识到。
答案 0 :(得分:1)
首先,您不应该使用substring(i,i++)
,而应使用substring(i,i+1)
。否则,您将增加i
,使您的代码跳过字母。
"abcdefghijklmnopqrstuvwxyz".contains(word.substring(i,i+1))
看起来像个错误。每个小写字母的每个循环都会导致consonantCount
增加。
如果你只处理单词(没有空格等),那么每个单词都是辅音或元音,所以你不需要第二个if
。您可以从vowelCount
中减去length
来获得辅音计数。
此外,如果您将第i个字符转换为大写,则可以省略|| "aeoiuy".contains(...)
部分。
答案 1 :(得分:0)
其他答案和评论已经显示您的代码存在问题。我只想添加一个可能的基于流的解决方案,通过重新调整基于索引的循环和局部变量来减少错误的可能性:
private static boolean moreVowels(String word)
{
return word.chars()
.mapToObj(c -> Character.toString((char) c).toUpperCase())
.mapToInt(c -> "AEIOUY".contains(c) ? 1 : "BCDFGHJKLMNPQRSTVWXZ".contains(c) ? -1 : 0)
.sum() > 0;
}
您也可以将toUpperCase()
应用于您自己的实现,以使if
语句更短(再次避免可能的错误)。