元音最多的单词

时间:2016-10-15 18:58:02

标签: java methods

我试图找到用户输入的句子中元音最多的单词。现在当我调用这个方法时,它可以用更短的句子工作。但当它超过7个单词时,它不会打印出元音最多的单词。我似乎无法发现错误=(

我提前感谢你们!

private static void getWordMostVowel(String sentence) {

    String word = "";
    String wordMostVowel = "";
    int temp = 0;
    int vowelCount = 0;
    char ch;

    for(int i = 0; i < sentence.length(); i++){
        ch = sentence.charAt(i);

        sentence = sentence.toLowerCase();

        if (ch != ' '){
            word = word + ch;
            if ( ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u' )
                vowelCount++;
        }

        else {
            if(vowelCount > temp){
                temp = vowelCount;
                wordMostVowel = word;
            }
            word = " ";
        }
    }

    System.out.println("The word with the most vowels is: " + " " + wordMostVowel);

}

3 个答案:

答案 0 :(得分:2)

我建议采用不同的解决方案:不要尝试构建&#34;手动的话;这会给你的代码增加许多不必要的复杂性。

相反,请转到:

Set<Character> vowels = new HashSet<T>(Arrays.asList('a', 'e' ...));

上面创建了一个数组你的单词(假设你的输入只是在每个单词之间使用空格)。

从那里你可以做类似的事情:

for (String oneWord : words) {
  int vowelCount = 0;
  for (int i=0; i< oneWord.length; i++) {
    if (vowels.contains(oneWorg.getCharAt(i))) { 
      vowelCount++;
    }
  }
}

以上创建了一个包含所有元音的集合。

现在:

String theWordWithTheMostVowelsSoFar = "";
int maxVowelCountSoFar = 0;

以上是每个单词;然后计算元音。内循环结束后,您知道当前单词中的元音。

对于最终解决方案,您需要:

{{1}}

在内部循环完成后,只需检查/更新这两个变量。我将这作为练习留给读者,不要把所有的东西都拿走。

答案 1 :(得分:0)

至少,你错过了句子的最后一个单词,因为它后面没有[0, 0, 0, 0] [0, 0, 0, 1] [0, 0, 1, 0] [0, 0, 1, 1] [0, 1, 0, 0] [0, 1, 0, 1] [0, 1, 1, 0] [0, 1, 1, 1] [1, 0, 0, 0] [1, 0, 0, 1] [1, 0, 1, 0] [1, 0, 1, 1] [1, 1, 0, 0] [1, 1, 0, 1] [1, 1, 1, 0] [1, 1, 1, 1] (例如,尝试使用{{的输入运行此方法) 1}} - 你输错了。

我以另一种方式去做这件事 - 我将句子分成单词,流式传输,并按元音数量取最大值:

' '

答案 2 :(得分:0)

如果你的练习确实是从迭代字符中手动构建你的单词(这很可能是因为你还没有触及Arrays),那么有一些事情要考虑所有其他人在这里已经通知了你。

在大多数情况下,您确实只需要执行一些操作,以使当前代码按需运行。一般来说,大多数情况下你都需要稍微调整一下。

首先,不要破坏句子字符串的原创性,将其全部转换为较低的字母大小写,原因很简单,就像在放置代码行时那样比较条件语句中的字符:

sentence = sentence.toLowerCase();

可以理解的是,句子中的任何单词都可以以大写字母开头,全部为大写,甚至是驼峰,但无论您在创建和存储实际单词(元音最多的单词)时都需要原创性。因为它最初是在句子中提供的。当然为了节省很多 || (OR)语句,你肯定希望在全部大写或大写字母的情况下工作,但在 IF 条件语句之前做使用 Character.toLowerCase()方法。是的,这需要更多的时间来处理,但它可以忽略不计,例如:

word+= ch;   // This is the same as:  word = word + ch;
// ch is now only going to be used within the conditional 
// statement below so we can modify it here.
ch = Character.toLowerCase(ch);
if ( ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u' ){ 
    vowelCount++; 
}

通过这种方式,变量 ch 中保存的字符可以保持其原创性,并且在 FOR 循环(将要持有的那个)中创建单词时在字符串变量 word 中,它将与句子字符串中提供的内容完全相同。

其次,正如其他人已经提到的那样, IF / ELSE FOR 循环中的结构方式,它没有正确考虑到你的最后一个字提供句子字符串。循环处理它但由于句子字符串末尾没有空格字符, IF / ELSE 无法对数据进行任何操作来检查它。有一个简单的解决方法,那就是添加一个额外的条件来配合(ch!=&#39;&#39;)条件,以便允许 IF此条件块中的/ ELSE 代码继续处理句子字符串的最后一个字符。您只需检查以确保 FOR 循环中使用的变量 i 未达到其限制因此允许 ELSE 部分处理。这是修复:

// Can you see the added condition below?
if (ch != ' ' && i != (sentence.length() - 1)){
    word+= ch;   // This is the same as:  word = word + ch;
    // ch is now only going to be used within the conditional 
    // statement below so we can modify it here.
    ch = Character.toLowerCase(ch);
    if ( ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u' ){
        vowelCount++; 
    }
}
else { 
    if(vowelCount > temp){
        temp = vowelCount;
        wordMostVowel = word;
    }
    word = ""; vowelCount = 0;
}

第三,正如其他人所提到的,你需要在每个单词之后将 vowelCount 变量清零,以便获得正确的计数。事实上,你需要正确地清除单词字符串变量,并给它一个空字符串(&#34;&#34;)而不是空格字符(&#39;&#39;)。如果你没有,那么在创建的第一个单词之后的每个单词都将以Space字符开头。您实际上可以在 ELSE 代码块中的代码示例中看到这一点。

最后,这只是一个建议,让用户知道当你显示其中元音最多的单词时实际发现了多少个元音,可能是这样的:

System.out.println("The word with the most vowels (" + temp + ") is: " + " " + wordMostVowel);

尽管如此,你还是很接近......好工作。