【问题标题】:Why aren't my words coming out less than 8 characters?为什么我的字数不少于 8 个字符?
【发布时间】:2015-05-11 18:07:58
【问题描述】:
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 个字符的单词。

【问题讨论】:

    标签: java list arraylist


    【解决方案1】:

    看这段代码:

    if(word.length() > MAX_COUNT)
        compWord();
    
    return word;
    

    如果选择的单词比您的限制长,您将递归调用 compWord - 但忽略返回值,并且无论如何只返回“太长”的单词。

    我个人建议您避免递归,而只使用do/while 循环:

    String word;
    do
    {
        word = lines.get(rand.nextInt(lines.size());
    } while (word.length() > MAX_COUNT);
    return word;
    

    或者,在您阅读这些行时过滤 earlier

    while(line != null) {
        if (line.length <= MAX_COUNT) { 
            lines.add(line);
        }
        line = reader.readLine();
    }
    return lines.get(rand.nextInt(lines.size()));
    

    这样,您只需从有效行中挑选出开始。

    请注意,顺便说一下,使用Files.readAllLines 是从文本文件中读取所有行的一种相当简单的方法 - 目前您不会在之后关闭文件...

    【讨论】:

    • 但是 compWord 不应该在它返回任何东西之前重新启动吗?
    • @tdrunner95:是的,它再次开始,选择一个随机单词,可能再次递归,然后返回一个单词。然后,您忽略该返回值,并返回第一次选择的任何内容。我认为您需要稍微了解一下递归...
    • 谢谢。我的教授几乎没有提到递归。我会进一步研究。
    • @tdrunner95:递归是你目前正在做的,但这个问题真的不需要递归。您应该尝试了解为什么您当前的代码不起作用 - 然后以不同的方式解决问题,而不是让递归表单起作用。
    【解决方案2】:

    如果单词超过 8 个字符,您只需再次调用您的方法,继续,不会有任何变化。

    所以:

    • 您正在从文件中获取所有单词,

    • 然后从List中随机取一个词,放到wordString中,

    • 如果单词超过 8 个字符,则再次运行该方法。

    • 但是,最后,它会总是返回它首先选择的单词。问题是您只是递归地调用该方法,而您对返回值什么也不做。你正在调用一个方法,它会做一些事情,调用者方法将继续,在这种情况下返回你的word。此方法是否递归无关紧要。

    相反,我建议您使用非递归解决方案,如 Skeet 所推荐的那样,或者学习一些关于递归以及如何使用它的知识。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-26
      • 1970-01-01
      • 2015-12-05
      • 1970-01-01
      • 2018-07-31
      • 2015-11-08
      • 1970-01-01
      相关资源
      最近更新 更多