Javaでコレクションをシャッフルする

Javaでのコレクションのシャッフル

1. 概要

この簡単な記事では、how we can shuffle a collection in Javaが表示されます。 Javaには、Listオブジェクトをシャッフルするための組み込みメソッドがあります。これを他のコレクションにも利用します。

2. リストのシャッフル

We’ll use the method [.pl-smi]#java.util.Collections.shuffle [.blob-code-inner] [。pl-smi]。これは###入力としてListを受け取り、インプレースでシャッフルします。 インプレースとは、要素をシャッフルした新しいリストを作成する代わりに、入力で渡されたリストと同じリストをシャッフルすることを意味します。

Listをシャッフルする方法を示す簡単な例を見てみましょう。

List students = Arrays.asList("Foo", "Bar", "Baz", "Qux");
Collections.shuffle(students);

There’s a second version of [.pl-smi]#java.util.Collections.shuffle [.blob-code-inner] [。pl-smi]that also accepts as input a custom source of randomness.これは、アプリケーションにそのような要件がある場合に、シャッフルを決定論的なプロセスにするために使用できます。#

[.pl-smi]#Let’s use this second variant to achieve the same shuffling on two lists:

List students_1 = Arrays.asList("Foo", "Bar", "Baz", "Qux");
List 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);

When using identical sources of randomness (initialized from same seed value), the generated random number sequence will be the same for both shuffles.したがって、シャッフル後、両方のリストにまったく同じ順序で要素が含まれます。

3. 順序付けられていないコレクションの要素をシャッフルする

We may want to shuffle other collections as well such as Set, Map, or Queue, for example, but all these collections are unordered —特定の順序を維持しません。

LinkedHashMapComparatorを含むSetなどの一部の実装は、固定された順序を維持するため、それらをシャッフルすることもできません。

ただし、we can still access their elements randomly by converting them first into a List, then shuffling this List.

Mapの要素をシャッフルする簡単な例を見てみましょう。

Map studentsById = new HashMap<>();
studentsById.put(1, "Foo");
studentsById.put(2, "Bar");
studentsById.put(3, "Baz");
studentsById.put(4, "Qux");

List> shuffledStudentEntries
 = new ArrayList<>(studentsById.entrySet());
Collections.shuffle(shuffledStudentEntries);

List shuffledStudents = shuffledStudentEntries.stream()
  .map(Map.Entry::getValue)
  .collect(Collectors.toList());

同様に、Setの要素をシャッフルできます。

Set students = new HashSet<>(
  Arrays.asList("Foo", "Bar", "Baz", "Qux"));
List studentList = new ArrayList<>(students);
Collections.shuffle(studentList);

4. 結論

このクイックチュートリアルでは、[.pl-smi]#java.util.Collections.shuffle [.blob-code-inner] [。pl-smi]#を使用してJavaでさまざまなコレクションをシャッフルする方法を説明しました。 ##

これは当然List,と直接連携し、間接的に利用して他のコレクションの要素の順序をランダム化することもできます。 ランダム性のカスタムソースを提供し、それを決定論的にすることで、シャッフルプロセスを制御することもできます。

いつものように、この記事で示されているすべてのコードは利用可能なover on GitHubです。