Есть ли способ применить перемешивание Кнута к структуре данных стека? - PullRequest
4 голосов
/ 22 января 2009

Для класса программирования я создаю программу блэкджека для первого домашнего задания. Профессор дал нам образец класса карт, который включает метод добавления их в колоду. Для своей колоды она использует ArrayList, который вы легко можете Knuth Shuffle с помощью метода Collections.shuffle ().

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

Ответы [ 8 ]

20 голосов
/ 22 января 2009

Оба java.util.ArrayList<E> и java.util.stack<E> реализуют интерфейс java.util.List<E>, а Collections.shuffle() занимает java.util.List<?> в качестве параметра. Вы должны быть в состоянии передать Stack в Collections.shuffle(), если только вы не используете другую реализацию стека, которая не реализует java.util.list<E>. Если да, я бы посоветовал вам переключиться на другую реализацию стека.

2 голосов
/ 22 января 2009

Стек - это список, поэтому вы можете вызывать Collections.shuffle () в вашем стеке.

Тем не менее, Stack - это старый класс, такой как Vector, и он устарел. В настоящее время вы должны использовать Dequeue (двусторонняя очередь, которая работает как очередь или стек), а не стек , но , очереди не являются списками, поэтому они не могут быть перемешиваются.

Кроме того, вы всегда можете положить свои карты в список, перемешать их, а затем добавить все их в очередь

2 голосов
/ 22 января 2009

Я полагаю, что с ArrayList гораздо проще выполнять операции со стеком.

0 голосов
/ 22 января 2009

метод Collections.shuffle () делает то, что вам не нужно явно.

"Если указанный список не реализует интерфейс RandomAccess и является большим, эта реализация shuffle () помещает указанный список в массив перед его перемешиванием и сбрасывает перемешанный массив обратно в список. Это позволяет избежать квадратичного поведения это будет результатом перетасовки списка «последовательного доступа» на месте.

это то, что в документации Java говорится о реализации метода Collections.shuffle () поэтому передача java.util.Stack (реализация интерфейса java.util.List) должна работать ...

0 голосов
/ 22 января 2009

Просто перемешайте перед / когда вы кладете карты в стопку. Так как правильно реализованный Кнут-шаффл не позволяет заменять карты в уже пройденной части колоды, вы можете просто положить их в стек по мере продвижения ...

Поскольку java не позволит вам рассматривать стек как список произвольного доступа, просто скопируйте его из стека в ArrayList, чтобы выполнить фазу перетасовки (добавление дополнительного элемента ArrayList в 52 элемента не представляет особой проблемы)

0 голосов
/ 22 января 2009

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

0 голосов
/ 22 января 2009

Нет, случайное перемешивание Фишера-Йейтса зависит от произвольного доступа к набору данных. Вам нужна коллекция, которая позволяет получить (int index). Если вам нужен стек, просто используйте список. нажмите и поп просто вызовите get (0) и добавьте (0). Это лучше, чем реализация некоторого пользовательского класса стека. Используйте то, что у вас есть, не изобретайте новые классы.

0 голосов
/ 22 января 2009

Нет причины, по которой структура стека также не должна иметь произвольный доступ (java.util.Stack делает, хотя это имеет свои проблемы). Кроме этого, вы можете поместить элементы стека в ArrayList, перемешать и затем вернуть их обратно в ваш стек.

...