Перетасовка коллекций на 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 - они не поддерживают определенный порядок.

Некоторые реализации, такие какLinkedHashMap илиSet сComparator, поддерживают фиксированный порядок, поэтому мы также не можем их перемешать.

Однако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());

Точно так же мы можем перемешать элементы aSet:

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.