Gibt es eine Möglichkeit, Knuth-shuffle, um eine Stack-Datenstruktur?
Für eine Programmierung Klasse erstelle ich ein blackjack-Programm für die erste Hausaufgabe. Der professor hat uns eine Probe-Karte-Klasse beinhaltet die Methode, um Sie in ein deck. Für Ihr deck, Sie verwendet eine ArrayList, die Sie leicht Knuth-Shuffle mit den Sammlungen.shuffle () - Methode.
Dass die Methode funktioniert nicht für Stacks, obwohl (offensichtlich), aber ich denke, dass ein Stack-Struktur am besten für dieses Programm, da Sie möglicherweise den pop-und push-Karten ins deck.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Beide
java.util.ArrayList<E>
undjava.util.stack<E>
Umsetzung derjava.util.Liste<E>
- Schnittstelle, undSammlungen.shuffle()
dauertjava.util.List<?>
als parameter. Sie sollten in der Lage sein, um pass einStack
inCollections.shuffle()
, es sei denn, du bist mit einem anderen stack-Implementierung, die nicht implementiertjava.util.list<E>
. Wenn Sie sind, würde ich raten, Sie wechseln zu einem anderen stack-Implementierung.Ich denke, es ist viel einfacher zu tun, stack-Operationen auf einer ArrayList.
Ein stack ist eine Liste, so können Sie call-Sammlungen.shuffle() auf Ihrem Stapel.
Sagte, Stack ist eine alte Klasse, wie Vektor-und irgendwie altmodisch. Heutzutage würden Sie einen Dequeue (eine double ended queue, die als entweder einen queue-oder stack -) dann lieber einen Stapel aber, aus der Warteschlange entfernt werden, keine Listen, so dass Sie können nicht gemischt werden.
Können, können Sie auch immer Ihre Karten in einer Liste, mischen Sie, und fügen Sie dann alle von Ihnen zu einem Dequeue
Gibt es keinen Grund, weshalb eine stack-Struktur sollte nicht ein zufälliger Zugriff (java.util.Stack funktioniert, obwohl, die haben Ihre eigenen Probleme). Andere als das, Sie können die pop-Elemente des Stacks in einer ArrayList, shuffle und schieben Sie Sie dann zurück auf Ihre Stapel.
Nein, Fisher-Yates-shuffle basiert auf den wahlfreien Zugriff auf das dataset. Sie müssen einige Sammlung, die es ermöglicht get(int index). Wenn Sie einen Stapel verwenden Sie einfach eine Liste. push und pop nur Aufruf get(0) und add(0). Das ist besser als die Umsetzung einige benutzerdefinierte Stapel-Klasse. Verwenden Sie, was Sie haben, nicht neu erfinden-Klassen.
Adams Antwort ist am besten für einen stack. Für Kartenspiele, was ich normalerweise verwende ist eine einfache arraylist, und entfernen Sie zufällige Elemente. Kein mischen erforderlich.
Nur Schlurfen, bevor/als Sie die Karten auf den Stapel.
Da ein ordnungsgemäß umgesetzt Knuth shuffle nicht erlaubt, Ersatz-Karten in den Teil des Decks bereits durchquert, können Sie einfach legen Sie Sie auf den Stapel, wie Sie entlang gehen...
Seit java lassen Sie nicht behandeln, ein stack als ein random-access-Liste einfach kopieren aus dem stack in eine ArrayList zu tun, die schlurfenden phase (ein extra-52 element ArrayList um klopfen ist keine große Sache),
den Sammlungen.shuffle () - Methode übernimmt das für Sie Sie müssen nicht explizit.
", Wenn die angegebene Liste nicht implementiert das interface RandomAccess und groß ist, ist diese Umsetzung shuffle() gibt die angegebene Liste in ein array, bevor Sie mischen Sie es, und Deponien, die gemischt array zurück in die Liste. Dies vermeidet das quadratische Verhalten, das zur Folge hätte, das ein "sequential access" - Liste im Ort."
dies ist, was die java-Dokumentation sagt über Sammlungen.shuffle() Methode Umsetzung
so übergeben Sie eine java.util.Stack (eine Implementierung von java.util.Liste interface) sollte funktionieren...