4

プログラミングのクラスで、最初の宿題としてブラックジャック プログラムを作成しています。教授はサンプル カード クラスを提供してくれました。これには、それらをデッキに追加する方法が含まれています。彼女のデッキでは、Collections.shuffle() メソッドを使用して簡単に Knuth シャッフルできる ArrayList を使用しています。

ただし、その方法は (明らかに) スタックでは機能しませんが、カードをデックに出し入れする可能性があるため、このプログラムにはスタック構造が最適であると思います。

4

8 に答える 8

20

と の両方がインターフェイスjava.util.ArrayList<E>java.util.stack<E>実装し、パラメーターとして を受け取ります。を実装していない別のスタック実装を使用していない限り、 aをに渡すことができるはずです。もしそうなら、別のスタック実装に切り替えることをお勧めします。java.util.List<E>Collections.shuffle()java.util.List<?>StackCollections.shuffle()java.util.list<E>

于 2009-01-21T22:19:07.713 に答える
2

ArrayList でスタック操作を行う方がはるかに簡単だと思います。

于 2009-01-21T22:19:07.480 に答える
2

スタックはリストなので、スタックで Collections.shuffle() を呼び出すことができます。

とは言っても、Stack は Vector のような古いクラスであり、時代遅れのクラスです。最近では、スタックではなくデキュー(キューまたはスタックとして機能する両端キュー) を使用します、デキューはリストではないため、シャッフルできません。

また、いつでもカードをリストに入れてシャッフルし、すべてをデキューに追加できます

于 2009-01-21T22:23:25.867 に答える
0

アダムの答えは、スタックに最適です。カード ゲームの場合、私が通常使用するのは単純な配列リストで、ランダムな要素を削除します。シャッフルは必要ありません。

于 2009-01-21T22:29:09.630 に答える
0

カードをスタックに置く前にシャッフルするだけです。適切に実装されたクヌース シャッフルでは、既にトラバースされたデッキの一部のカードを交換することはできないため、進むにつれて単純にそれらをスタックに置くことができます...

Java ではスタックをランダム アクセス リストとして扱うことができないため、スタックから ArrayList にコピーして、シャッフル フェーズを実行します (余分な 52 要素の ArrayList をノックすることは大したことではありません)。

于 2009-01-21T22:31:58.860 に答える
0

スタック構造がランダム アクセスであってはならない理由はありません (java.util.Stack はそうですが、それ自体に問題があります)。それ以外に、スタックの要素を ArrayList にポップし、シャッフルしてからスタックにプッシュすることができます。

于 2009-01-21T22:18:07.013 に答える
0

いいえ、Fisher-Yates シャッフルはデータセットへのランダム アクセスに依存しています。get(int index) を許可する Collection が必要です。スタックが必要な場合は、リストを使用してください。プッシュとポップは、get(0) と add(0) を呼び出すだけです。これは、カスタム スタック クラスを実装するよりも優れています。あなたが持っているものを使用し、新しいクラスを発明しないでください。

于 2009-01-21T22:23:23.620 に答える
0

Collections.shuffle() メソッドは、明示的に行う必要はありません。

「指定されたリストが RandomAccess インターフェイスを実装しておらず、サイズが大きい場合、shuffle() のこの実装は、指定されたリストをシャッフルする前に配列にダンプし、シャッフルされた配列をリストに戻します。これにより、結果として生じる 2 次動作が回避されます。 「シーケンシャルアクセス」リストを所定の位置にシャッフルすることから。」

これは、Java ドキュメントが Collections.shuffle() メソッドの実装について述べていることなので、java.util.Stack (java.util.List インターフェイスの実装) を渡すとうまくいくはずです...

于 2009-01-21T23:36:24.830 に答える