这里的新手总数。我用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);
}
}
}
答案 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
}
您还可以remove
和get
一次性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;
}