Рубрики
Без рубрики

Перетасовка Коллекций В Java

Узнайте, как перемешивать различные коллекции в Java.

Автор оригинала: baeldung.

1. Обзор

В этой краткой статье мы увидим , как мы можем перетасовать коллекцию в Java . В Java есть встроенный метод для перетасовки объектов List — мы будем использовать его и для других коллекций.

2. Перетасовка списка

Мы будем использовать метод java.util.Collections.shuffle , который принимает в качестве входных данных Список и перемешивает его на месте. Под “на месте” мы подразумеваем, что он перетасовывает тот же список, что и при вводе, вместо создания нового списка с перетасованными элементами.

Давайте рассмотрим краткий пример, показывающий, как перетасовать Список :

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

Есть вторая версия java.util.Collections.shuffle , который также принимает в качестве входных данных пользовательский источник случайности . Это может быть использовано для того, чтобы сделать перетасовку детерминированным процессом, если у нас есть такое требование для нашего приложения.

Давайте используем этот второй вариант для достижения одинакового перетасовки в двух списках:

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);

При использовании идентичных источников случайности (инициализированных из одного и того же начального значения) сгенерированная последовательность случайных чисел будет одинаковой для обоих перетасовок. Таким образом, после перетасовки оба списка будут содержать элементы в одном и том же порядке.

3. Перетасовка элементов неупорядоченных коллекций

Мы можем захотеть перетасовать и другие коллекции, такие как Set, Map, или Queue , например, но все эти коллекции неупорядочены — они не поддерживают никакого определенного порядка.

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

Однако мы все еще можем получить доступ к их элементам случайным образом, сначала преобразовав их в Список , а затем перетасовав этот Список .

Давайте рассмотрим краткий пример перетасовки элементов Карты :

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 students = new HashSet<>(
  Arrays.asList("Foo", "Bar", "Baz", "Qux"));
List studentList = new ArrayList<>(students);
Collections.shuffle(studentList);

4. Заключение

В этом кратком руководстве мы рассмотрели, как использовать java.util.Collections.shuffle для перемешивания различных коллекций в Java.

Это, естественно, работает непосредственно со списком , и мы можем использовать его косвенно для рандомизации порядка элементов в других коллекциях. Мы также можем управлять процессом перетасовки, предоставляя пользовательский источник случайности и делая его детерминированным.

Как обычно, весь код, продемонстрированный в этой статье, доступен на GitHub .