JavaのCollectionsクラス
のshuffleメソッド
について使い方などをまとめます。
shuffleメソッド
とは、List
などのコレクションをシャッフルするためのメソッドです。内部で生成された乱数を使って、コレクションがシャッフルされます。
1Collections.shuffle(List<?> list);
2Collections.shuffle(List<?> list, Random rnd);
引数はシャッフルしたいコレクションの他、Randomクラス
のオブジェクトを第2引数に指定することができます。その場合はシャッフルするための乱数を指定することができます。
また、ランダムに数字を出力したい場合にも、Randomクラス
を使うことができます。こちらは数字の範囲を指定して、ランダムに出力させることができますが、数字が重複する可能性があります。
対して、shuffleメソッド
はList
で指定した数字を1つずつ使った重複しないリストを簡単に作ることができます。また、文字列等もシャッフルすることが可能です。
なお、配列にはshuffleメソッド
が使えませんので注意してください。既に配列の中に入っている要素をシャッフルするには、一端ArrayList
に配列の中身を取り出す必要があるので注意しましょう。
ArrayList
を使って、1から10が格納されたコレクションを作りシャッフルしてみます。
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の数字がシャッフルされていることが分かります。
先ほどは数値型のリストをシャッフルしてみました。今度は文字列の配列をシャッフルしてみます。
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]
文字列の配列がシャッフルされていることが分かります。
次に、Randomクラス
のオブジェクトを第2引数に指定してシャッフルしてみます。
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メソッド
の使い方でした。以上で記事を終わりにします。