這比你要求的,但它與切線相關,並可能幫助人們解決這個問題。
當你想要一個隨機整數的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