Collections.shuffle(список списка)

Что побудит использовать этот метод?

Обновление: теперь я вижу смысл. Мне нравится причина Ури: «Перетасовка - не тривиальный алгоритм». Это совершенно верно.


person fastcodejava    schedule 31.05.2010    source источник


Ответы (4)


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

Перетасовка не является тривиальным алгоритмом, как и сортировка. Поэтому она достаточно распространена, чтобы потребовать библиотечной функции.

Что касается списка - очевидно, это должна быть упорядоченная коллекция, а не какая-либо общая коллекция. Только список и его подтипы гарантированно упорядочены. Класс Collections не предоставляет операций для массивов, но вы можете (и, вероятно, должны для повышения производительности) передать ArrayList в этот метод.

person Uri    schedule 31.05.2010
comment
... на самом деле реализация довольно тривиальна. Каждый элемент получает новый индекс, если слот уже занят, коллекция (или итератор) вычисляет следующий свободный слот. - person Andreas Dolk; 31.05.2010
comment
@Andreas_D не недооценивайте это, вы должны быть осторожны, используя алгоритм, в котором все перестановки равновероятны, так что это не совсем тривиально - см. en.wikipedia.org/wiki/Fisher-Yates_shuffle - person Jesper; 31.05.2010
comment
... только что посмотрел фактическую реализацию в коллекциях. Там это решается довольно просто. Но, возможно, не оптимально. - person Andreas Dolk; 31.05.2010
comment
Я видел, как алгоритм перестановки появлялся на собеседованиях при приеме на работу, так что он определенно не совсем тривиален. Я также использую Collections.sort(), хотя я знаю, как писать quicksort :) - person Uri; 01.06.2010

Эм, если у вас есть коллекция, и вы хотите ее перетасовать...

Наиболее очевидным примером может быть карточная игра, в которой у вас есть объекты, представляющие отдельные карты, и коллекция, представляющая колоду, которую вы хотите перетасовать.

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

person Jon Skeet    schedule 31.05.2010

Итак, представьте, что вы моделируете колоду карт. Shuffle будет одной из первых функций, которые вы напишете.

В любое время, когда вы хотите рандомизировать содержимое коллекции, вы должны использовать перемешивание.

person Alan    schedule 31.05.2010

Некоторые идеи, как вы могли бы использовать этот метод:

  • Перетасовка карт в игре
  • Рандомизировать массив в тестовом примере для алгоритма сортировки
  • Перетасовка тестовых наборов в вашем наборе тестов, чтобы убедиться, что они не зависят друг от друга.
  • Если вы пытаетесь решить NP-полную задачу, такую ​​как коммивояжёр, один из подходов состоит в том, чтобы взять входные данные, перетасовать их несколько раз, а затем использовать результат наименьшей длины. Это дает вам решение, которое выполняется за время O(N) (где N — количество узлов).
person Aaron Digulla    schedule 31.05.2010