【问题标题】:Choosing a Random word from a text file从文本文件中选择一个随机词
【发布时间】:2020-06-13 09:44:44
【问题描述】:

我正在尝试开发一个刽子手作为一项作业,但无法从文本文件中获取一个随机单词(其中包含各种单词,每个单词用空格分隔)。我编写了一个代码来获取一个随机单词,但无法选择一个单词并将其替换为我在“Function()”中的示例字符串 (String w = "this";)。

 public String randomWord(String wordran) {

    try {
        BufferedReader reader = new BufferedReader(new FileReader("C:\\Users\\Admin\\Documents\\NetBeansProjects\\Main\\words.txt"));
        String line = reader.readLine();
        List<String> words = new ArrayList<String>();
        while (line != null) {
            String[] wordline = line.split(" ");
            for (String word : wordline) {
                words.add(word);
            }
            Random rand = new Random();
            String randomWord1 = words.get(rand.nextInt(words.size()));
            //System.out.println("rand word : " + randomWord1);

        }
        reader.close();

    } catch (Exception e) {

    }
    return wordran;


}


   public void function(){

    int numGuesses = 10;
    String w = randomWord();

    String[] word = w.split("");
    ArrayList< String> wList = new ArrayList<>(Arrays.asList(word));
    ArrayList< String> wAnswer = new ArrayList< String>(wList.size());
    for (int i = 0; i < wList.size(); i++) {
        wAnswer.add("_ ");
    }
    int left = wList.size();
    Scanner scanner = new Scanner(System.in);
    boolean notDone = true;
    ArrayList< String> lettersGuessed = new ArrayList< String>();

    while (notDone) {
        System.out.println();
        String sOut = "";

        List< String> lettersLeft = getRemainingLetters(lettersGuessed);
        for (String s : lettersLeft) {
            sOut += s + " ";
        }
        System.out.println("Letters Left: " + sOut);

        sOut = "";
        for (int i = 0; i < wList.size(); i++) {
            sOut += wAnswer.get(i);
        }
        System.out.println(sOut + " Guesses left:" + numGuesses);
        System.out.print("Enter a letter(* exit): ");
        String sIn = scanner.next();
        numGuesses--;
        if (sIn.equals("*")) {
            break;
        }
        lettersGuessed.add(sIn);
        for (int i = 0; i < wList.size(); i++) {
            if (sIn.equals(wList.get(i))) {
                wAnswer.set(i, sIn);
                left--;
            }
        }
        if (left == 0) {
            System.out.println("Congradulations you guessed it!");
            break;
        }
        if (numGuesses == 0) {
            System.out.println("You failed...:(");
            break;
        }

    }

}

public static void main(String[] args) throws IOException {
    Main ma = new Main();

    ma.function();

    loadWords();

   // ma.randomWord();

}

【问题讨论】:

  • 提示:如果 void randomWord() 方法被定义为 String randomWord() 会很有帮助,这样您现在就可以在 function() 中写入 String w = randomWord();
  • @Kevin 正如你所提到的,我已将其更改为“public String randomWord()”,并返回一个空值并写入“String w = randomWord();”在'function()'里面。但由于某种原因,它没有运行的代码。
  • 你能比“不跑步”更具体一点吗?另外,请更新此帖子以显示您所做的代码更改。
  • @KevinAnderson,我已经用更改更新了上面的代码。
  • 好吧,我明白为什么它不起作用了。如果randomWord 定义为String randomWord(String wordran),那么在调用它时必须传递String 参数,如String w = randomWord(someStringVariableOrLiteral);。如果您只是将其保留为String randomArgument(),那么String w = randomWord(); 就可以了。所以现在你需要问自己“为什么我要在 randomWord 中添加 String 参数,这是一个以前没有的参数,而且在没有它的情况下总是相处得很好?”

标签: java arrays arraylist random


【解决方案1】:

您的代码存在三个问题:

  1. 你不需要传递参数String wordran来存储随机词。一个有用的参数可以是String path,通过它您可以将文件的路径传递给函数。
  2. 您错过了从循环中的文件读取内容。您只阅读了第一行。
  3. 您还没有返回应用Random#nextInt计算出来的随机词。

附带说明一下,我建议您使用 try-with-resources 语法来避免显式关闭 BufferedReader

以下是包含这些 cmets 的正确代码:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class Main {
    public static void main(String[] args) throws IOException {
        // Test
        System.out.println(getRandomWord("C:\\Users\\Admin\\Documents\\NetBeansProjects\\Main\\words.txt"));
    }

    public static String getRandomWord(String path) throws IOException {
        List<String> words = new ArrayList<String>();
        try (BufferedReader reader = new BufferedReader(new FileReader(path))) {
            String line;
            while ((line = reader.readLine()) != null) {
                String[] wordline = line.split("\\s+");
                for (String word : wordline) {
                    words.add(word);
                }
            }
        }
        Random rand = new Random();
        return words.get(rand.nextInt(words.size()));
    }
}

【讨论】:

  • @Arvind Kumar Avinash,我试过你的代码。但是当我在 'Function()' 方法中调用 String w = getRandomWord("C:\\Users\\Admin\\Documents\\NetBeansProjects\\Main\\words.txt") 代码时,会出现运行时异常。那么如何将方法添加到函数()中。得到一个随机词
  • String w = getRandomWord("C:\\Users\\Admin\\Documents\\NetBeansProjects\\Main\\words.txt"); 是正确的语法。你能发布例外吗?
猜你喜欢
  • 2012-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多