2008-10-08 28 views
6

我感到非常沮喪,因爲我似乎無法弄清爲什麼Collections洗牌無法正常工作。使用Collections API來洗牌

比方說,我想洗牌randomizer陣列。

int[] randomizer = new int[] {200,300,212,111,6,2332}; 
Collections.shuffle(Arrays.asList(randomizer)); 

由於某些原因,元素保持排序完全相同,不管我是否稱爲洗牌方法。有任何想法嗎?

+0

另請參閱[此重複](http://stackoverflow.com/questions/3981420/collections-shuffle) – basZero 2011-11-01 07:36:46

回答

18

Arrays.asList不能與基元的陣列中使用。改爲:

Integer[] randomizer = new Integer[] {200,300,212,111,6,2332}; 
Collections.shuffle(Arrays.asList(randomizer)); 

同樣的規則適用於集合框架中的大多數類,因爲您不能使用基本類型。

原代碼(有int[])編譯的罰款,但由於預期沒有工作,因爲一個可變方法asList的行爲:它只是讓一元素列表,與int陣列作爲其唯一的成員。

+0

福氣!我在想這個問題是列表將被排序,但不是原始數組,但Arrays.asList中的javadocs說列表使用了底層數組。 如果你增加了這個列表,你將會遇到一個問題! (數組將獲得一個新的陣列代替) – 2008-10-08 00:58:30

+0

謝謝你的解釋清楚 – VeePee 2008-10-08 05:30:17

0

克里斯的答案是正確的。

正如我在克里斯的回答評論說,除非該ArrayList需要成長,而列表中創建一個新的,複製的項目到它的基礎數組將相應地變化。

您可能希望保留到列表的引用,並遍歷該Arrays.asList調用之後,而不是之後在陣列上遍歷,遍歷列表,而不是。