我正在尝试编写一个将读入文件的程序,并在文件中找到具有最多连续元音的单词。我这样做是通过从文件中获取每个新单词,将其转换为charArray,然后评估数组中的字符以查看它们是否为元音。计数器保持连续元音的数量,然后如果当前字的计数器大于最大的先前计数器值,则变量maxVowelString设置为当前计数器的值。
我已经解决了许多关于我如何处理charArray的错误,但是当我在终端中运行它时,它什么也没做,只是在无限循环中结束。我无法弄清楚是什么导致了它。有没有人有任何想法? (我在编码方面有点新,所以可能存在逻辑错误或我不理解的东西。)
更新:我做了几个建议的更改,然后进行了调试。该程序陷入了这个特定的循环,但我无法弄清楚原因。
while ((i + n) < lowercase.length())
{
System.out.println("i + n " + (i + n));
if ((charsList.get(i+n) == 'a') || (charsList.get(i+n) == 'e') || (charsList.get(i+n) == 'i') || (charsList.get(i+n) == 'o') || (charsList.get(i+n) == 'u'))
{
isVowel = true;
counter++;
System.out.println("counter " + counter);
i++;
}
else
{
isVowel = false;
}
}
答案 0 :(得分:0)
你在第二个循环中有缺陷,你在迭代这个词。设置n = 1和counter = 0会在找到下一个字母作为元音时导致无限循环。它在同一个字母上无限迭代。以下是更新的代码段(仅更新逻辑):
while (fileIn.hasNext())
{
word = fileIn.next();
String lowercase = word.toLowerCase();
char[] wordChar = word.toCharArray();
int i = 0;
int counter = 0;
while (i < lowercase.length()) {
if ((wordChar[i] == 'a') || (wordChar[i] == 'e') || (wordChar[i] == 'i') || (wordChar[i] == 'o')
|| (wordChar[i] == 'u')) {
counter++;
} else {
i++;
continue;
}
i++;
}
if (counter > maxVowelString) {
maxVowelString = counter;
maxVowelWord = lowercase;
}
}
System.out.println("The word in this file with the most consecutive vowels is " + maxVowelWord + ".");
System.out.println("It has " + maxVowelString + "vowels.");
答案 1 :(得分:0)
首先,行if(fileIn.hasNext())是错误的。用while(fileIn.hasNext())放置它。这是因为当你从一个文件中读取时你不知道它何时结束所以这一点循环将检查您的文件是否有下一个单词。注意 - 当您从文件中调用hasNext()时,否则您将始终具有无限循环(这只是您正在阅读时的一般信息(word = fileIn.next ())从文件中没有问题)。
其次,看看这个循环 -
while (isVowel == true)
{
counter = 0;
int n = 1;
if ((wordChar[i+n] == 'a') || (wordChar[i+n] == 'e') || wordChar[i+n] == 'i') || (wordChar[i+n] == 'o') || (wordChar[i+n] == 'u'))
{
isVowel = true;
counter++;
}
else
isVowel = false;
n++;
}
现在假设一个单词“Queuing” - 当n = 1时第一个条件为真;然后计数器++;循环再次运行,如果条件满足则现在n = 2,依此类推,直到最后一个元素为'i'为止遇到..现在,i的价值是什么(只看到它)....所以,为了使它正确,这必须是下面的循环..
`while (isVowel == true)
{
counter = 0;
int n = 1;
if ((wordChar[i+n] == 'a') || (wordChar[i+n] == 'e') || wordChar[i+n] == 'i') || (wordChar[i+n] == 'o') || (wordChar[i+n] == 'u'))
{
isVowel = true;
counter++;i++;
}
else{
isVowel = false;
i++;continue;
}
n++;
}`
当您想要从您检查过的位置开始..
希望这对你有所帮助。