【Java】shuffleメソッドでコレクションをシャッフルする方法

【Java】shuffleメソッドでコレクションをシャッフルする方法

Javaでコレクションの要素をランダムでシャッフルするには、Collectionsクラスshuffleメソッドが便利です。メソッドの使い方についてまとめていきます。

目次

shuffleメソッドとは

shuffleメソッドとは、Listなどのコレクションをシャッフルするためのメソッドです。内部で生成された乱数を使って、コレクションがシャッフルされます。

shuffleメソッドの書式例
1Collections.shuffle(List<?> list);
2Collections.shuffle(List<?> list, Random rnd);

引数はシャッフルしたいコレクションの他、Randomクラスのオブジェクトを第2引数に指定することができます。その場合はシャッフルするための乱数を指定することができます。

また、ランダムに数字を出力したい場合にも、Randomクラスを使うことができます。こちらは数字の範囲を指定して、ランダムに出力させることができますが、数字が重複する可能性があります。

対して、shuffleメソッドListで指定した数字を1つずつ使った重複しないリストを簡単に作ることができます。また、文字列等もシャッフルすることが可能です。

shuffleメソッドで数字をシャッフルする

ArrayListを使って、1から10が格納されたコレクションを作りシャッフルしてみます。

ShuffleTest1.java
 1import java.util.ArrayList;
 2import java.util.Collections;
 3
 4public class ShuffleTest1 {
 5
 6  public static void main(String[] args) {
 7
 8    // ArrayListであるlistを宣言する
 9    ArrayList<Integer> list = new ArrayList<Integer>();
10
11    // listに1~10を順番に格納し表示
12    for (int i = 1; i <= 10; i++) {
13      list.add(i);
14    }
15    System.out.println(list);
16
17    // listをシャッフルし表示
18    Collections.shuffle(list);
19    System.out.println(list);
20
21    // listをシャッフルし表示
22    Collections.shuffle(list);
23    System.out.println(list);
24  }
25}
出力結果(一例)
1[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
2[6, 2, 10, 7, 8, 5, 9, 3, 1, 4]
3[6, 3, 8, 1, 9, 5, 10, 2, 7, 4]

1~10の数字がシャッフルされていることが分かります。

shuffleメソッドで文字列をシャッフルする

先ほどは数値型のリストをシャッフルしてみました。今度は文字列の配列をシャッフルしてみます。

ShuffleTest2.java
 1import java.util.ArrayList;
 2import java.util.Collections;
 3
 4public class ShuffleTest2 {
 5
 6  public static void main(String[] args) {
 7
 8    // listにone,two,three,four,fiveの文字列を格納し表示
 9    ArrayList<String> list = new ArrayList<String>();
10    list.add("one");
11    list.add("two");
12    list.add("three");
13    list.add("four");
14    list.add("five");
15    System.out.println(list);
16
17    // シャッフルしたlistを表示する
18    Collections.shuffle(list);
19    System.out.println(list);
20
21    // シャッフルしたlistを表示する
22    Collections.shuffle(list);
23    System.out.println(list);
24  }
25}
出力結果(一例)
1[one, two, three, four, five]
2[one, two, three, five, four]
3[three, two, five, four, one]

文字列の配列がシャッフルされていることが分かります。

shuffleメソッドのシャッフルをRandomクラスを指定する

次に、Randomクラスのオブジェクトを第2引数に指定してシャッフルしてみます。

ShuffleTest3.java
 1import java.util.ArrayList;
 2import java.util.Collections;
 3import java.util.Random;
 4
 5public class ShuffleTest3 {
 6  public static void main(String[] args) {
 7
 8    // listに1~10を順番に格納し表示
 9    ArrayList<Integer> list = new ArrayList<Integer>();
10    for (int i = 1; i <= 10; i++) {
11      list.add(i);
12    }
13    System.out.println(list);
14    // Randomクラスのインスタンスを生成
15    Random random = new Random(0);
16    // listをシャッフルし表示
17    Collections.shuffle(list, random);
18    System.out.println(list);
19
20    System.out.println();
21
22    // listに1~10を順番に格納し表示
23    ArrayList<Integer> list2 = new ArrayList<Integer>();
24    for (int i = 1; i <= 10; i++) {
25      list2.add(i);
26    }
27    System.out.println(list2);
28    // Randomクラスのインスタンスを生成
29    Random random2 = new Random(0);
30    // listをシャッフルし表示
31    Collections.shuffle(list2, random2);
32    System.out.println(list2);
33  }
34}
出力結果(一例)
1[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
2[5, 9, 10, 7, 4, 6, 3, 2, 8, 1]
3
4[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
5[5, 9, 10, 7, 4, 6, 3, 2, 8, 1]

Randomクラスのインスタンス生成時に、引数に同じ数字を指定する(乱数を生成するのに使うseed値を同じにする)とシャッフルの結果も同じになることが分かります。


以上がshuffleメソッドの使い方になります。なお、配列にはshuffleメソッドが使えませんので注意してください。既に配列の中に入っている要素をシャッフルするには、一端ArrayListに配列の中身を取り出す必要があるので注意しましょう。

以上で記事を終わりにします。

参考文献

関連記事