【问题标题】:Printing an array of random words given the number of words requesed by input in Java给定Java中输入请求的单词数,打印一个随机单词数组
【发布时间】:2021-08-12 22:34:33
【问题描述】:
        String sql_query = "SELECT * FROM words";
        ResultSet rs = statement_object.executeQuery(sql_query);
        List<String> wordsList = new ArrayList<>();
        int size = wordsList.size();
        System.out.println("Enter the number of words you want to sort");
        int numWords = input.nextInt();
        int j4 = 0;
        while (rs.next()) {
            String words = rs.getString("Word");
            words = words.toLowerCase();
            dictionaryWords.add(words);
            j4++;
            
            for (int i = 0; i < numWords; i++) {
                String [] randomWords = new String[numWords];
                Random rand = new Random();
                System.out.println(words);
            }
            }

代码重复打印我的数据库中的单词。 例如,

输入要排序的字数:3

玫瑰

玫瑰

玫瑰

我需要它打印以从数据库(或任何给定的输入)中提取 3 个随机单词并打印该结果。例如, 输入要排序的字数:3

玫瑰

【问题讨论】:

  • 我会分解:a. 进行查询(如果只需要一列,不要SELECT *,只需要必要的列)。 b. 将字词添加到您的Listc.List 上调用Collections.shuffle 并删除前n 个单词。如果你喜欢,请先复制一份

标签: java arrays arraylist input


【解决方案1】:

这里有两个问题:

  1. 为什么我的代码每个单词都打印了 3 次,并且
  2. 如何从数据库中打印三个随机单词?

第一季度

要回答第一个问题,请仔细阅读您的代码在做什么:

  • while 循环遍历数据库中的每一行:
    • while (rs.next())
  • for 循环迭代您输入到numWords 的次数:
    • for (int i = 0; i &lt; numWords; i++)
  • println 打印它刚刚从数据库中读取的单词:
    • String words = rs.getString("Word");
    • System.out.println(words);

所以,如果您考虑一下,它的意思是“对于数据库中的每个单词,循环 3 次并打印该单词”。这正是您所观察到的。

第二季度

回答第二个问题,

  1. 我会首先从数据库中获取所有单词并将其放入一个数组中。这就是你对dictionaryWords所做的:

    • dictionaryWords.add(words);
  2. 然后我会循环 numWords 时间。所以将for 循环拉到while 循环之外。

  3. 然后在循环的每次迭代中,从dictionaryWords 中获取一个随机词。您的代码实际上并未使用您创建的 rand 对象。查看这个 Stackoverflow 问题,了解如何使用它的示例:

【讨论】:

【解决方案2】:

也许从数据库中得到准确的结果会更好:

//add order by if want the result to be shuffle
//MSQL
select top 3 distinct(word) from words ORDER BY NEWID()

//mysql
select distinct(word) from words ORDER BY RAND() limit 3 
...etc (see exact syntax for your rdbms)

注意:Order by 可以有第二个参数来优化排序,但如果第一个条件随机将不起作用。

进行额外的 java 处理非常耗时。除此之外,如果您使用所有记录和列,您将增加查询执行时间。

如果真的想检索所有单词,那么您可以使用Set 仅存储不同的单词,但仍需要转移到List 以进行随机排序和排序后。现在由您决定如何更好地处理。

仍然有使用子查询的方法。

//mysql
select w.word
from
    (
      select distinct(word) word 
      from words 
      order by rand() 
      limit 3
    ) w
order by w.word desc //asc default

或者只是从具有增强功能的 java 中对其进行排序,可能使用 TreeSet 保留已排序的元素等。

【讨论】:

  • 你不能洗牌Set,你需要一个List
  • @MaartenBodewes,是的,我的错误
猜你喜欢
  • 1970-01-01
  • 2017-11-03
  • 2012-08-20
  • 1970-01-01
  • 1970-01-01
  • 2014-04-05
  • 2021-03-21
  • 1970-01-01
  • 2016-12-06
相关资源
最近更新 更多