陷入困境从ArrayList生成随机顺序

时间:2017-03-23 19:02:45

标签: java arrays arraylist random

这里的新手总数。我用java编写了一个程序来帮助随机化我正在组织的音乐会的乐队顺序。我无法让代码工作。在打印三个字符串而不是四个字符串后,我得到的输出终止,经常重复字符串(我不想要)并在第三个字符串后终止并出现以下错误:

“java.lang.IllegalArgumentException:bound必须为正”

任何人都可以帮我解决问题吗?

public class BandRandomizer
{
public static void main(String[] args) 
{
    ArrayList<String> bands = new ArrayList<>();
    bands.add("Band A");
    bands.add("Band B");
    bands.add("Band C");
    bands.add("Band D");

    Random gen = new Random();
    int index = 0;

    for (int i = 3; i >= 0; i--)
    {
        index = gen.nextInt(i);
        System.out.println(bands.get(index));
        bands.remove(i);    
    }



}

}

3 个答案:

答案 0 :(得分:3)

您在调用nextInt(0)时在最后一个循环中抛出异常:

  

线程中的异常&#34; main&#34; java.lang.IllegalArgumentException:bound必须为正数           在java.util.Random.nextInt(Random.java:388)

应该是:

for (int i = 4; i > 0; i--) { //changed
    index = gen.nextInt(i); // return value in range [0..i) perfect for indexing
    System.out.println(bands.get(index));
    bands.remove(index); //changed
}

您还可以removeget一次性remove返回已移除的项目:

System.out.println(bands.remove(index));

但这是一种糟糕的改组方式,请使用Collections.shuffle

Collections.shuffle(bands);
for (String band : bands) {
    System.out.println(band);
}

答案 1 :(得分:2)

你绝对应该使用Collection.shuffle()。但是如果你不想在JDK中使用东西,或者你想知道你哪里做错了,那么这就是你的错误。

您需要修复两个地方。

Random.nextInt(x)返回一个介于0和x - 1之间的随机整数。因此,i应该从4变为1:

for (int i = 4; i >= 1; i--)

for循环中的最后一行不正确。我想你在这里要做的就是删除已经选中的乐队。已选择的波段不是索引i,而是索引index。因此,将最后一行更改为:

bands.remove(index);

另一种方法是仅从4循环到2并打印数组列表中的剩余项目。我认为这种方法更快。

答案 2 :(得分:2)

尝试以下代码。它适用于您的问题。

public static void main(String[] args) 
{
    ArrayList<String> bands = new ArrayList<>();
    bands.add("Band A");
    bands.add("Band B");
    bands.add("Band C");
    bands.add("Band D");
    int i=1;
    Collections.shuffle(bands);
    for(String band: bands){

        System.out.println(i++ + ". " +band);
    }

}

您获得Exception的原因是:nextInt参数的值必须大于零。

public int nextInt(int n) {
   if (n <= 0)
     throw new IllegalArgumentException("n must be positive");

   if ((n & -n) == n)  // i.e., n is a power of 2
     return (int)((n * (long)next(31)) >> 31);

   int bits, val;
   do {
       bits = next(31);
       val = bits % n;
   } while (bits - val + (n-1) < 0);
   return val;
 }