Javaでコレクションをシャッフルする
1概要
このクイック記事では、Javaでコレクションをシャッフルする方法を説明します。 Javaには、Listオブジェクトをシャッフルするための組み込みメソッドがあります – 他のコレクションにも利用します。
2リストをシャッフルする
-
** 入力として
List
を受け取り、その場でシャッフルする方法を使用します。インプレースとは、シャッフルされた要素を持つ新しいリストを作成するのではなく、入力で渡されたのと同じリストをシャッフルするということです。
List
をシャッフルする方法を示す簡単な例を見てみましょう。
List<String> students = Arrays.asList("Foo", "Bar", "Baz", "Qux");
Collections.shuffle(students);
-
__
** の2番目のバージョンがあります
List<String> students__1 = Arrays.asList("Foo", "Bar", "Baz", "Qux");
List<String> students__2 = Arrays.asList("Foo", "Bar", "Baz", "Qux");
int seedValue = 10;
Collections.shuffle(students__1, new Random(seedValue));
Collections.shuffle(students__2, new Random(seedValue));
assertThat(students__1).isEqualTo(students__2);
-
同じ乱数のソース(同じシード値から初期化されたもの)を使用する場合、生成される乱数列は両方のシャッフルで同じになります。
3番号なしコレクションの要素をシャッフルする
-
Set、Map、
、または__Queueなど、他のコレクションもシャッフルしたい場合がありますが、これらのコレクションはすべて順序付けられていません** – 特定の順序を維持することはできません。
LinkedHashMap
、または
Set
と
Comparator
のようないくつかの実装は、固定された順序を維持します。したがって、それらをシャッフルすることはできません。
しかし、** 最初に
List
に変換してから、この
List
をシャッフルすることで、ランダムに要素にアクセスすることができます。
Map
の要素をシャッフルする簡単な例を見てみましょう。
Map<Integer, String> studentsById = new HashMap<>();
studentsById.put(1, "Foo");
studentsById.put(2, "Bar");
studentsById.put(3, "Baz");
studentsById.put(4, "Qux");
List<Map.Entry<Integer, String>> shuffledStudentEntries
= new ArrayList<>(studentsById.entrySet());
Collections.shuffle(shuffledStudentEntries);
List<String> shuffledStudents = shuffledStudentEntries.stream()
.map(Map.Entry::getValue)
.collect(Collectors.toList());
同様に、
Set
の要素をシャッフルすることができます。
Set<String> students = new HashSet<>(
Arrays.asList("Foo", "Bar", "Baz", "Qux"));
List<String> studentList = new ArrayList<>(students);
Collections.shuffle(studentList);
4結論
このクイックチュートリアルでは、____の使い方を見ました。
いつものように、この記事で示されているすべてのコードはhttps://github.com/eugenp/tutorials/tree/master/core-java-collections[over on GitHub]から入手できます。