【问题标题】:Random Generate String from ArrayList without replacement in JAVA从 ArrayList 随机生成字符串而不在 JAVA 中替换
【发布时间】:2014-07-09 04:37:15
【问题描述】:

我正在尝试创建一个允许用户输入姓名列表的程序。然后程序会从 ArrayList 中随机拉取,每次拉取一个名字,直到所有名字都用完。我完成了扫描仪部分,如下所示:

public class Auction
{
    public static void main (String[] args)
    {
        Scanner scan = new Scanner(System.in);
        ArrayList<String> names = new ArrayList<String> ();
        char quit = 'Y';
        String playername = null;

        while (quit == 'Y')
        {
            System.out.println("\nPlayer Name:");
            playername = scan.next();
            names.add (playername);

            System.out.print("Enter Another Name? (Y/N) \n");
            String word = scan.next();
            word = word.toUpperCase();
            quit = word.charAt(0);
        }
      }
   }

我有另一堂课,我试图完成随机生成但没有成功。似乎没有任何错误,但它也不起作用。我知道我在“没有替换的随机”部分上还有很长的路要走,但我只是想在我继续之前让它工作。我不确定我是否从其他拍卖类中引用了 ArrayList。像许多其他人一样,我是 Java 新手,所以要温柔。我已经花了一个星期的时间来解决这个问题,这可能需要我几个小时。感谢您的帮助。

public class Draft
{
    Random randomGenerator;
    ArrayList<String> names;

    String randName() {
    int index = randomGenerator.nextInt(names.size());
    System.out.println("Next on the Block" + names.get(index));
    return names.get(index);
    }
}

【问题讨论】:

  • 你想实现什么我的意思是你喜欢从 arraylist 创建字符串?
  • @Josh 我认为实例化 randomGenerator 更好,因为构造函数 Random() --> 创建一个新的随机数生成器。此构造函数将随机数生成器的种子设置为一个很可能与此构造函数的任何其他调用不同的值。
  • 我想将用户输入的名称作为 ArrayList,然后一次随机生成一个,不重复,直到全部生成。这基本上是一个名称拍卖。名称列表进入。然后,每次击键(空格键)时,他们将被随机调用,一个接一个,直到所有都被投标。该程序只接受输入的名称,并一次随机生成一个,以便观众可以对它们进行投标。

标签: java arrays string random arraylist


【解决方案1】:

只需使用Collections.shuffle() 将列表本身打乱:

Collections.shuffle(names);

您的列表现在是随机的,您可以从顶部取出元素,直到它为空。例如,使用迭代器:

Iterator<List> it = names.iterator();

while (it.hasNext()) {
    String name = it.next();

    it.remove(); // optionally remove

    System.out.println("Next on the block" + name);
}

或者,如果实际上不需要从列表中删除名称,则使用简单的 for 循环:

for (String name : names) {
    System.out.println("Next on the block" + name);
}

【讨论】:

  • 我明白你在解释什么。我理解这个概念。但是当我尝试实际实现这一点时,我有很多错误。几乎就像它没有从 Auction 类中识别出我的 ArrayList。在 for 或 while 的任何一种情况下,Draft 类代码应该是什么样子?
  • 这不起作用。我不断收到 Collection 和 Iterator 中的“名称”错误。就像我之前提到的,这个类几乎无法识别 ArrayList “名称”。这可能是我的问题。对 ArrayList 的调用正确吗?
  • @Josh 您只是没有将您的 names 对象传递给您的 Draft 类。在Draft 中创建一个构造函数:public Draft(List&lt;String&gt; names) { this.names = names; },在你的main 方法中创建一个新的Draft 对象,并将names 传递给Draft 构造函数。
  • 如果你能亲自向我展示它在我的草稿课中应该是什么样子,我会很高兴的。因为它仍然显示错误并且没有注意到名称列表。就像我之前提到的,创建列表工作正常。草稿课是我遇到所有错误的地方。我是一个“展示我”的学习者。如果您通过使用我的代码向我展示您的意思,我将继续学习并吸收它。所以请告诉我我的草稿班应该是什么样子。
猜你喜欢
  • 1970-01-01
  • 2017-01-06
  • 1970-01-01
  • 1970-01-01
  • 2017-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-22
相关资源
最近更新 更多