2011-12-08 44 views
0

如何創建方法RandomArray並讓它取整數n並返回由0到255之間的n個隨機數組成的整數的ArrayList(換句話說:讓返回的數組的大小爲n)? ? (我使用Java的Eclipse) 我創建了RandomArray,但是我不知道如何把它放在一個ArrayList,這是我到目前爲止有:返回由n個隨機數組成的整數的ArrayList?

import java.util.Random; 
    public class Lab6 { 

    public static void main(String[] args) { 

    Random random = new Random(); 
    int[] n = new int[1]; 

    for(int i = 0 ; i < n.length ; i++) { 
     for (int i1 = 0 ; i1 < n.length ; i1++) { 
      n[i1] = random.nextInt(255); 
     } 
    } 
    for(int a : n) { 
     System.out.println(a); 
    } 
} 
    } 

回答

1

的ArrayList工作在許多與數組相同,只是它們可以隨意增大(或縮小),並且不支持通過[]運算符進行訪問/檢索(即不能在ArrayList上執行n[i1])。相反,請使用其方法add()向其中添加元素,並使用get()方法訪問元素。

1

你的意思是這樣的:

public ArrayList<Integer> randomArrayList(int n) 
{ 
    ArrayList<Integer> list = new ArrayList<>(); 
    Random random = new Random(); 

    for (int i = 0; i < n; i++) 
    { 
     list.add(random.nextInt(255)); 
    } 
    return list; 
} 
+0

感謝您的快速回復! – howzat

+0

@ user1086318 Np。儘管這裏瞭解到底發生了什麼很重要。我錯過了作業標籤,通常我不會只是發出一個完整的解決方案,但ooooops = P –

+0

謝謝,是的,我一定想知道發生了什麼,否則它沒有意義要做! – howzat

0

嘗試是這樣的

private ArrayList<Integer> randomArray(int size){ 
Random random = new Random(); 

ArrayList<Integer> newArrayList = new ArrayList<Integer>(); 

for(int i=0; i<size; i++){ 
int next = random.nextInt(256); 
newArrayList.add(next); 
} 

return newArrayList; 

} 
+0

您正在嘗試將整數添加到Integer類型的集合中。這會導致編譯器錯誤。 –

+0

我向你保證它不會。編譯器錯誤從哪裏來? –

+0

除非新版本的Java將執行從int到Integer的隱式轉換,否則它會(自從1.4.2以來我沒有做過很多)。你正在嘗試將一個類型爲'int'的變量'next'添加到需要類型爲'Integer'的對象的類型化通用集合'newArrayList'中。 –

0

主要方法中包含一個例子使用

import java.security.*; 
import java.util.*; 


public class Util { 

    public static void main(String[] args) { 
     int n = 15; 

     ArrayList<Integer> integers = RandomArray(n); 

     for (Integer integer : integers) { 
      System.out.println(integer); 
     } 


    } 

    private static ArrayList<Integer> RandomArray(int n) { 
     Random rand = new SecureRandom(); 
     byte[] b = new byte[n]; 
     rand.nextBytes(b); 
     Integer[] ints = new Integer[b.length]; 
     for (int i = 0; i < b.length; i++) { 
      ints[i] = b[i] & 0xFF; 
     } 
     return new ArrayList<Integer>(Arrays.asList(ints)); 
    } 
} 
0

這比你要求的,但它與切線相關,並可能幫助人們解決這個問題。

當你想要一個隨機整數的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); 
} 

使用此模式爲隨機數據生成往往會使你的代碼更清潔,更精簡,更容易閱讀。試試看:)