public String compWord() throws IOException, ClassNotFoundException
{
// Local constants
final int MAX_COUNT = 8;
// Local variables
BufferedReader reader = new BufferedReader(new FileReader("dictionary.txt")); // Create a new BufferedReader, looking for dictionary.txt
List<String> lines = new ArrayList<String>(); // New ArrayList to keep track of the lines
String line; // Current line
Random rand = new Random(); // New random object
String word; // The computer's word
/********************* Start compWord *********************/
// Start reading the txt file
line = reader.readLine();
// WHILE the line isn't null
while(line != null)
{
// Add the line to lines list
lines.add(line);
// Go to the next line
line = reader.readLine();
}
// Set the computers word to a random word in the list
word = lines.get(rand.nextInt(lines.size()));
if(word.length() > MAX_COUNT)
compWord();
// Return the computer's word
return word;
}
根据我的理解,它应该只返回少于8个字符的单词?知道我做错了什么吗? if语句应该回忆compWord,直到该单词少于8个字符。但由于某些原因,我仍然可以从10-15个字符中获取单词。
答案 0 :(得分:4)
看看这段代码:
if(word.length() > MAX_COUNT)
compWord();
return word;
如果挑选的单词超过了您的限制,则您会递归调用compWord
- 但忽略返回值,只返回&#34;太长&#34;无论如何,这个词。
我个人建议您避免递归,而只是使用do
/ while
循环:
String word;
do
{
word = lines.get(rand.nextInt(lines.size());
} while (word.length() > MAX_COUNT);
return word;
或者,在阅读以下内容时,先过滤 :
while(line != null) {
if (line.length <= MAX_COUNT) {
lines.add(line);
}
line = reader.readLine();
}
return lines.get(rand.nextInt(lines.size()));
这样你就只能从有效行中挑选出来。
请注意,顺便说一句,使用Files.readAllLines
是一种从文本文件中读取所有行的简单方法 - 目前您还没有关闭文件...
答案 1 :(得分:0)
如果单词超过8个字符,您只需再次调用您的方法,继续,不做任何更改。
所以:
您正在从文件中获取所有单词
然后从列表中获取一个随机单词,并将其放入word
字符串,
如果单词长度超过8个字符,则该方法会再次运行。
但,最后,它将始终返回它首先选择的单词。问题是你只是递归地调用方法,而你对返回值什么都不做。你正在调用一个方法,它会做一些事情,调用方法将继续,在这种情况下返回你的word
。这种方法是否递归并不重要。
相反,我建议您使用非递归解决方案,如Skeet推荐的那样,或者学习一些关于递归以及如何使用它的方法。