我收到了一些代码,我试图通过压缩将其置于更好的格式中:
ArrayList<Integer> a = new ArrayList<Integer>();
ArrayList<Integer> c = new ArrayList<Integer>();
for(int i = 0; i < 10; i++) {
int nextInt = rand.nextInt();
while((a.contains(nextInt) ? 1:0) + ((nextInt < 0) ? 1:0) +
((nextInt > 1000) ? 1:0) >= 1){
nextInt = rand.nextInt();
}
a.add(nextInt);
nextInt = rand.nextInt();
while(((c.contains(nextInt))?1:0) + ((nextInt < 0)?1:0) +
((nextInt > 1000)?1:0) >= 1) {
nextInt = rand.nextInt();
}
c.add(nextInt);
}
在 while 循环中有完全相同的代码,但我想知道如果合并它是否会丢失随机性。但是, while 条件对我来说似乎很奇怪;谁能解释一下?你会如何压缩这段代码?
最佳答案
while 条件让我想起了 C 风格的条件,其中 false 是 0 而 true 是 0 以外的东西。但是,Java 有明确的 boolean 值,所以对条件使用这样的东西更有意义:
a.contains(nextInt) || (nextInt < 0) || (nextInt > 1000)
该代码被放入 while
循环中,因为该代码显然需要生成一个从 0 到 1000(含)的唯一数字列表。如果它违反了被“ored”的三个条件中的任何一个,那么我们需要生成一个新的随机数并重试。如果违反了第一个条件,则说明该数字不唯一,如果违反后两个条件中的任何一个,则说明该数字不在指定范围内。
我可能会将该循环放在名为 generateUniqueValueInrange
或类似方法的方法中,并将列表和边界作为参数。此外,我猜测 rand
是一个 java.util.Random
对象。请注意,Random
有一个 nextInt(int n)
方法,它会为您生成一个范围内的数字,这样您就不必一直生成新的数字,直到它们发生落在你想要的范围内。参见 http://download.oracle.com/javase/6/docs/api/java/util/Random.html#nextInt%28int%29
另请注意,您正在尝试生成两个列表,其中包含从 0 到 1000 的 10 个唯一数字。因此,您可能会考虑使用更直接的方法来做到这一点。我个人基本上使用这里的方法来完成类似的任务,但是“循环直到随机性对我有用”方法很容易出错,因为如果条件不可行,很容易进入无限循环。
关于java - 如何压缩这段代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5850244/