这比你要求的,但它与切线相关,并可能帮助人们解决这个问题。
当你想要一个随机整数的ArrayList
,你通常真的只需要一些随机数,并不真的需要它们存储在任何地方。在这种情况下,您可能只需要一个Iterator<Integer>
即可得到尽可能多的随机整数。这对于Guava库(现在应该成为每个Java代码库的一部分)非常容易。
您可以轻松地定义Iterator<Integer>
,让你尽可能多的随机整数(或任何其它数据类型,你想要的),你问:
public static final Iterator<Integer> RAND_INT_ITER =
new AbstractIterator<Integer>() {
@Override
protected Integer computeNext() {
return ThreadLocalRandom.current().nextInt();
}
};
或者,如果你想使用Random.nextInt(int max)
方法:
public static Iterator<Integer> randIntIterator(final int max) {
return new AbstractIterator<Integer>() {
@Override
protected Integer computeNext() {
return ThreadLocalRandom.current().nextInt(max);
}
};
}
无论你需要什么,调用这个方法都没有问题,因为它不存储你不浪费时间或空间计算任何东西的状态,垃圾收集器会在你完成后为你清理它。我们使用ThreadLocalRandom
来确保它们是线程安全的,并避免在整个地方构建新的Random
对象(以及引入的潜在数据竞争条件,尽管新版本的Java非常聪明)。如果更有意义,您可以轻松使用现有的Random
对象。
一些例子:
// print random ints until we see one that's divisible by 100
while(true) {
int rnd = RAND_INT_ITER.next();
System.out.println(rnd);
if(rnd % 100 == 0) {
break;
}
}
// Get an iterator of exactly 10 random ints, [0,255)
Iterator<Integer> tenRandInts = Iterators.limit(randIntIterator(255), 10);
while(tenRandInts.hasNext()) {
System.out.println(tenRandInts.next());
}
// Note that the returned iterator above is still one-use, if you need to iterate
// Over the same numbers more than once, put them in a list first
// It's not a good idea to simply convert an Iterator into an Iterable, see:
// http://stackoverflow.com/a/14711323/113632
List<Integer> randIntLs = ImmutableList.copyOf(
Iterators.limit(randIntIterator(255), 10));
for(int rnd : randIntLs) {
System.out.println(rnd);
}
for(int rnd : randIntLs) {
System.out.println(rnd);
}
使用此模式为随机数据生成往往会使你的代码更清洁,更精简,更容易阅读。试试看:)
感谢您的快速回复! – howzat
@ user1086318 Np。尽管这里了解到底发生了什么很重要。我错过了作业标签,通常我不会只是发出一个完整的解决方案,但ooooops = P –
谢谢,是的,我一定想知道发生了什么,否则它没有意义要做! – howzat