KnuthシャッフルをStackデータ構造に適用する方法はありますか?
-
19-08-2019 - |
質問
プログラミングクラスでは、最初の宿題のブラックジャックプログラムを作成しています。教授はサンプルカードクラスを提供してくれました。これには、それらをデッキに追加するメソッドが含まれています。彼女のデッキでは、ArrayListを使用します。これは、Collections.shuffle()メソッドで簡単にKnuth Shuffleできます。
その方法は(明らかに)スタックでは機能しませんが、スタック構造は、カードを出し入れすることができるため、このプログラムに最適だと思います。
解決
java.util.ArrayList<E>
と<の両方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のような古いクラスで、時代遅れのようなものだ。最近では、デキュー(aスタックではなくキューまたはスタックとして機能する両端キュー) 、デキューはリストではないため、シャッフルできません。
また、いつでもカードをリストに入れてシャッフルし、すべてのカードをデキューに追加できます
スタック構造がランダムアクセスであってはならない理由はありません(java.util.Stackには独自の問題がありますが)。それ以外に、スタックの要素をArrayListにポップし、シャッフルしてから、スタックに戻すことができます。
いいえ、Fisher-Yates shuffleはデータセットへのランダムアクセスに依存しています。 get(int index)を許可するコレクションが必要です。スタックが必要な場合は、リストを使用してください。プッシュとポップはget(0)とadd(0)を呼び出すだけです。これは、カスタムスタッククラスを実装するよりも優れています。持っているものを使用し、新しいクラスを作成しないでください。
Adamの答えはスタックに最適です。カードゲームの場合、通常使用するのは単純な配列リストで、ランダムな要素を削除します。シャッフルは必要ありません。
スタックにカードを置く前または置くときにシャッフルします。 適切に実装されたKnuthシャッフルでは、既に通過したデッキの一部のカードの交換が許可されていないため、単純にカードをスタックに配置することができます...
javaでは、スタックをランダムアクセスリストとして扱うことができないため、スタックからArrayListにコピーしてシャッフルフェーズを実行するだけです(余分な52要素のArrayListのノックは大したことではありません)
Collections.shuffle()メソッドを使用すると、明示的に行う必要はありません。
<!> quot;指定されたリストがRandomAccessインターフェイスを実装せず、大きい場合、shuffle()のこの実装は、指定されたリストをシャッフルする前に配列にダンプし、シャッフルされた配列をリストにダンプします。これにより、<!> quot; sequential access <!> quot;をシャッフルすることから生じる二次的な動作を回避できます。リスト内の場所。<!> quot;
これはJavaのドキュメントでCollections.shuffle()メソッドの実装について述べていることです したがって、java.util.Stack(java.util.Listインターフェースの実装)を渡すと機能するはずです...