为什么我的单词不超过8个字符?

时间:2015-05-11 18:07:59

标签: java list arraylist

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个字符中获取单词。

2 个答案:

答案 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推荐的那样,或者学习一些关于递归以及如何使用它的方法。