Есть ли способ применить перемешивание Кнута к структуре данных стека?

StackOverflow https://stackoverflow.com/questions/467244

Вопрос

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

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

Это было полезно?

Решение

Оба java.util.ArrayList<E> и < a href = "http://java.sun.com/javase/6/docs/api/java/util/Stack.html" rel = "noreferrer"> java.util.stack<E> реализовать java.util.List<E> и Collections.shuffle() принимает java.util.List<?> в качестве параметра. Вы должны иметь возможность передавать Stack в java.util.list<E>, если только вы не используете другую реализацию стека, которая не реализует <=>. Если да, я бы посоветовал вам перейти к другой реализации стека.

Другие советы

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

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

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

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

.

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top