1. Обзор
В этой быстрой статье мы увидим, как мы можем перетасовать коллекцию в Java . В Java есть встроенный метод для перетасовки объектов List
— мы будем использовать его и для других коллекций.
2. Перетасовка списка
Мы будем использовать метод java.util.Collections.shuffle
, который принимает в качестве входных данных список
и перемешивает его на месте. Под «на месте» мы подразумеваем, что он перемешивает тот же список, который был передан во входные данные, вместо того, чтобы создавать новый список с перетасованными элементами.
Давайте рассмотрим быстрый пример, показывающий, как перетасовать List
:
List<String> students = Arrays.asList("Foo", "Bar", "Baz", "Qux");
Collections.shuffle(students);
Существует вторая версия java.util.Collections.shuffle
, которая также принимает в качестве входных данных пользовательский источник случайности . Это можно использовать, чтобы сделать перетасовку детерминированным процессом, если у нас есть такое требование для нашего приложения.
Давайте используем этот второй вариант, чтобы добиться одинакового перетасовки в двух списках:
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
с компаратором
, поддерживают фиксированный порядок, поэтому мы также не можем их перемешивать.
Однако мы по-прежнему можем получить доступ к их элементам случайным образом, сначала преобразовав их в List
, а затем перетасовав этот List
.
Давайте посмотрим на быстрый пример перетасовки элементов карты
:
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. Вывод
В этом кратком руководстве мы увидели, как использовать java.util.Collections.shuffle
для перемешивания различных коллекций в Java.
Это, естественно, работает непосредственно со списком,
и мы можем косвенно использовать его для рандомизации порядка элементов в других коллекциях. Мы также можем контролировать процесс перетасовки, предоставив собственный источник случайности и сделав его детерминированным.
Как обычно, весь код, продемонстрированный в этой статье, доступен на GitHub .