布尔值总是返回false,可能是由于值没有增加

时间:2017-10-23 06:39:58

标签: java boolean

此方法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;
        }
    }

我认为由于循环没有实际增加计数,它总是返回错误,但我不太清楚为什么不这样做。感谢您阅读,我确定答案是愚蠢的,我没有认识到。

2 个答案:

答案 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语句更短(再次避免可能的错误)。