簡體   English   中英

為什么Collections.shuffle()為我的數組失敗?

[英]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會導致asListint[]視為單個對象而不是數組。 它返回List<int[]>而不是List<Integer> 所以,你基本上是在改變單個元素List ,所以沒有什么能真正被洗牌。

請注意,已經給出的一些答案是錯誤的,因為asList返回由原始數組支持的List,沒有任何內容被復制 - 所有更改都反映在原始數組中。

這不起作用,因為對shuffle的調用是在Arrays.asList返回的List Arrays.asList ,而不是在底層數組上運行。 因此,當您遍歷數組以打印出值時,沒有任何更改。 你想要做的是保存對Arrays.asList返回的ListArrays.asList ,然后在你shuffle之后打印出該List的值(而不是數組的值)。

存儲由Arrays.asList重新存儲的列表並隨機播放......

List myShuffledList = Arrays.asList(arr);
Collections.shuffle(myShuffledList);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM