23

コードが機能しないのはなぜですか?

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] + " ");
        }
    }
}

結果は次のとおりです。0123 4 5 6 789。

ランダムにシャッフルされたシーケンスを期待していました。

4

4 に答える 4

45

Arrays.asList()ご想像のとおり、プリミティブ型の配列には適用できません。に適用するとint[]、のリストではなく のリストArrays.asList()が生成されます。したがって、新しく作成された のリストをシャッフルします。int[]Integerint[]

これは、Java の可変引数とジェネリックの微妙な動作です。Arrays.asList()として宣言されています

public static <T> List<T> asList(T... a)

したがって、何らかの型の引数をいくつか取りT、これらの引数を含むリストを生成するか、型の引数を 1 つ取りT[]、この配列に基づくリストを返すことができます (これが可変引数の仕組みです)。

ただし、後者のオプションTは、 が参照型の場合 (つまり、 などのプリミティブ型ではない場合) にのみ機能します。これは、参照型intのみがジェネリックで型パラメーターとして使用される可能性がある (およびTが型パラメーターである) ためです。

したがって、 を渡すと=int[]が得られ、コードは期待どおりに機能しません。しかし、参照型 (たとえば、)の配列を渡すと、 =が得られ、すべてが機能します。Tint[]Integer[]TInteger

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] + " "); 
} 
于 2010-10-20T19:20:02.023 に答える
6

次のコード行をテストに追加してみてください。

List l=Arrays.asList(arr);
System.out.println(l);

単一の要素を出力していることがわかりますList

Arrays.asListプリミティブ配列で使用すると、 が配列ではなく単一のオブジェクトとしてasList扱われます。の代わりに a をint[]返します。したがって、基本的に単一の要素をシャッフルしているので、実際には何もシャッフルされません。List<int[]>List<Integer>List

asList元の配列に基づく List を返し、何もコピーされないため、既に与えられた回答の一部が間違っていることに注意してください。すべての変更は元の配列に反映されます。

于 2010-10-20T19:28:20.977 に答える
-2

への呼び出しは、基になる配列ではなくによって返されたshuffleで動作しているため、これは機能しません。したがって、配列を繰り返し処理して値を出力しても、何も変更されていません。あなたがしたいことは、によって返された への参照を保存し、その後に(配列の値ではなく) その値を出力することです。ListArrays.asListListArrays.asListListshuffle

于 2010-10-20T19:13:59.680 に答える
-3

Arrays.asList によって返されたリストを保存し、それをシャッフルします...

List myShuffledList = Arrays.asList(arr);
Collections.shuffle(myShuffledList);
于 2010-10-20T19:18:19.483 に答える