1

Card クラスがあり、Deck クラスを作成したいと考えています。カードのリストを保存するためにコレクションで利用できるものを調べていますが、カードを操作する際には可能な限り多くの自由が必要であることを知っています。

デッキのどこにでも新しいカードを挿入し、それらをシャッフルし (Collections.shuffle() が機能するはずです)、任意のカードをのぞいて、上、下、および中央のどこからでもカードを取得 (削除) できるようにしたいと考えています。カードの山でできることは何でも可能であるべきです。たとえば、「LIFOのみ」の制限はありません。

これまでに見つけたものと、それぞれの問題は次のとおりです。

  • リスト: 必要なだけの自由を提供しているように見えますが、明らかに、一番上のカードを選ぶなどの単純なことのために、いくつかのヘルパー関数を追加する必要があります。今のところまだ私のお気に入りのソリューションです。
  • スタック: 潜在的に私が求めているすべてのことを行いますが、私が読んだことから、最良の実装ではありません (Vector を拡張し、その動作の単なるスタックではありませんか?)
  • Deque: 必要な機能がありますが、どのインデックスにも新しいアイテムを挿入できないようです (また、「getAt(index)」も同様です)。

私がやろうとしていることに対して、上記のどのクラスよりも優れた既製のクラスはありますか? 「完璧」なものが存在しない場合、代わりにどのクラスを拡張のベースとして使用する必要がありますか?

注: 今のところ、同期を気にするかどうかはわかりません。私はこれも Java 6 の観点から見ていますが、特に既製のソリューションがある場合は、Java 7 ソリューションに対してオープンです。

4

4 に答える 4

9

List基づくアプローチを使用します。あなたの要件はかなり曖昧ですが、Listあなたがやりたいことの良い基盤を提供します. またはなどの具象クラスを拡張するのではなく、クラスに a をラップすることListをお勧めします。すべての動作はクラスで定義する必要があります。すべての動作がオブジェクトに適しているとは限らないため、すべての動作を自動的に継承したくないことは確かです。DeckDeckListArrayListLinkedListDeckDeckListDeck

于 2013-07-02T19:41:12.090 に答える
0

collections.shuffle() を引き続き使用でき、要素を取得および追加するときに一定の時間オーバーヘッドが発生します。

于 2013-07-02T19:43:30.647 に答える
0

普通の古い配列の使用を検討しましたか?
カードを前方に押して空いているスロットに挿入し、いつでも任意のスロットから何かを選択し、シャッフルし、おそらくその他の操作が必要になる可能性があります。これは、クラスにラップされた方がうまく機能します。

利点:
- Java API のどのリスト / マップ / セット クラスよりも高速で軽量です。

欠点:
- 配列を操作するには (非常に基本的な) メソッドを記述する必要があります。

于 2013-07-02T19:46:46.303 に答える