[英]Why does Collections.shuffle() fail for my array?
為什么我的代碼不起作用?
package generatingInitialPopulation;
import java.util.Arrays;
import java.util.Collections;
public class TestShuffle {
public static void main(String[] args) {
int[] arr = new int[10];
for (int i = 0; i < arr.length; i++) {
arr[i] = i;
}
Collections.shuffle(Arrays.asList(arr));
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
}
}
其結果是:0 1 2 3 4 5 6 7 8 9。
我期待一個隨機改組的序列 。
Arrays.asList()
不能像您期望的那樣應用於基本類型的數組。 當應用於int[]
, Arrays.asList()
生成一個int[]
s列表而不是Integer
列表。 因此,您隨機播放新創建的int[]
列表。
這是Java中可變參數和泛型的微妙行為。 Arrays.asList()
聲明為
public static <T> List<T> asList(T... a)
因此,它可以采用某些類型T
幾個參數並生成包含這些參數的列表,或者它可以采用類型為T[]
一個參數並返回由此數組支持的列表(這是可變參數的工作方式)。
但是,后一個選項僅在T
是引用類型(即不是諸如int
的基本類型)時才起作用,因為只有引用類型可以用作泛型中的類型參數(並且T
是類型參數)。
因此,如果傳遞int[]
,則得到T
= int[]
,並且代碼無法按預期工作。 但是如果傳遞引用類型的數組(例如, Integer[]
),則得到T
= Integer
並且一切正常:
Integer[] arr = new Integer[10];
for (int i = 0; i < arr.length; i++) {
arr[i] = i;
}
Collections.shuffle(Arrays.asList(arr));
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
嘗試將這行代碼添加到您的測試中:
List l=Arrays.asList(arr);
System.out.println(l);
您將看到打印出單個元素List
。
在原始數組上使用Arrays.asList
會導致asList
將int[]
視為單個對象而不是數組。 它返回List<int[]>
而不是List<Integer>
。 所以,你基本上是在改變單個元素List
,所以沒有什么能真正被洗牌。
請注意,已經給出的一些答案是錯誤的,因為asList
返回由原始數組支持的List,沒有任何內容被復制 - 所有更改都反映在原始數組中。
這不起作用,因為對shuffle
的調用是在Arrays.asList
返回的List
Arrays.asList
,而不是在底層數組上運行。 因此,當您遍歷數組以打印出值時,沒有任何更改。 你想要做的是保存對Arrays.asList
返回的List
的Arrays.asList
,然后在你shuffle
之后打印出該List
的值(而不是數組的值)。
存儲由Arrays.asList重新存儲的列表並隨機播放......
List myShuffledList = Arrays.asList(arr);
Collections.shuffle(myShuffledList);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.