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