我试图找到用户输入的句子中元音最多的单词。现在当我调用这个方法时,它可以用更短的句子工作。但当它超过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);
}
答案 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);
尽管如此,你还是很接近......好工作。