2016-08-09 14 views
-2

のは、私は、標準的なトランプで遊んでシミュレートしようとしているとしましょう。可能なすべてのトランプ(デッキ)を作成

私はこのようなものがあります。このような

class Face { 
    Set<Character> Faces = new HashSet<Character>(
     Arrays.asList('2','3','4','5','6','7','8','9','T','J', 'Q', 'K', 'A') 
); 
} 

と何か:

public enum Suit { HEART, DIAMONDS, SPADES, CLUBS }私はオブジェクトで、そのようなセットやリンクリストとして、コレクションを作成する方法を

コレクションこれに最も適しており、コレクションの各ペアがどのタイプのオブジェクトであるべきかが決まります。

+2

最高appoachは、クラス2人のメンバーとの「カード」のようになります。顔やスーツ –

+0

@progressive_overloadはい、しかしどのように私はすべての可能な順列をカバーし、52個のカードオブジェクトのコレクションを生成するのでしょうか? – GFauxPas

+0

2つのループ:スーツのための外側の1つ、顔の内側の内側..あなたに52枚のカードオブジェクトを与えます。注文が重要かどうかに応じてリストまたはセットに入れてください。 –

答えて

0

@Progressive_overloadがコメントとしてだけで、これはおそらく最良の方法だろう。

カードクラス:

enum Suit {HEART, DIAMONDS, SPADES, CLUBS} 
enum Rank {TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN, JACK, QUEEN, KING, ACE} 
class Card { 
    public Rank rank; 
    public Suit suit; 

    public Card (Rank r, Suit s) { 
    rank = r; suit = s; 
    } 
} 

生成:

List<Card> deck = new ArrayList<Card>(); 

for (Suit s : Suit.values()) { 
    for (Rank r : Rank.values()) { 
    deck.add(new Card(r, s)); 
    } 
} 
+0

はい、可能なすべての置換をカバーする52個のCardオブジェクトのコレクションを生成するにはどうすればよいですか? – GFauxPas

+0

@GFauxPasのように? – Olian04

+0

これは有効なjavaではありません –

-1

を私は順序対によって(a、b)は、あなたがa.face < = b.faceことと「あなたはドンことを意味することを前提としてい同じカードの2倍のペアが必要です。その条件が真であるすべての値を反復処理してリストに追加するネストループが必要です(最初のカードの各ペアのソート順の値を保存しておくと簡単に確認できます)。

import java.util.ArrayList; 
import java.util.List; 

public class CardPairs 
{ 

    static char[] faces = {'2','3','4','5','6','7','8','9','T','J', 'Q', 'K', 'A'}; 
    static enum Suit { HEART, DIAMONDS, SPADES, CLUBS }; 

    static class Card 
    { 
     final char face; 
     final Suit suit; 

     public Card(char face, Suit suit) {this.face=face;this.suit=suit;} 
     @Override public String toString() {return face+" "+suit;} 
    } 

    static public class CardPair 
    { 
     final Card first; 
     final Card second; 

     public CardPair(Card first, Card second) {this.first=first;this.second=second;} 
     @Override public String toString() {return "("+first+", "+second+")";} 
    } 

    public static void main(String args[]) 
    { 
     List<CardPair> allPairs = new ArrayList<CardPair>(); 
     for(int i=0;i<faces.length;i++) 
      for(int j=i;j<faces.length;j++) 
       for(Suit suit1: Suit.values()) 
        for(Suit suit2: Suit.values()) 
        { 
         { 
          if(suit1!=suit2||i!=j) // assuming you don't want pairs of the same card 
          { 
          allPairs.add(new CardPair(new Card(faces[i],suit1),new Card(faces[j],suit2))); 
          } 
         } 
        } 
     System.out.println(allPairs); 
    } 
} 
+1

ネストされたループはそれほど多くありません。 – Enzokie

+0

それは私が今までに得た最も奇妙なdownvoteです:-)ネストされたループの数は、この問題に内在しています。 –

+0

downvote ...しかし、なぜ4ループですか? 2は十分でしょう –

1

それは、スーツのenumを作るために良好なパターンだランクのenum、その後enum#valuesをループ。

Olien04はsuggested a similar approachを持っていますが、彼のコードはコンパイルされませんでした。この理由から私はコンストラクタとtoStringメソッドを使って、この答えを彼に基づいて追加しました。

enum Suit {HEART, DIAMONDS, SPADES, CLUBS} 
enum Rank {TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN, JACK, QUEEN, KING, ACE} 

public class Card { 
    Rank rank; 
    Suit suit; 
    public Card (Rank r, Suit s) {rank = r; suit = s;} //public constructor 
    @Override 
    public String toString() { 
     return rank.toString() + " " + suit.toString(); 
    } 
} 

ArrayList<Card> deck = new ArrayList<>(); 
for (Suit s : Suit.values()) { 
    for (Rank r : Rank.values()) { 
     deck.add(new Card(r, s)); 
    } 
} 
System.out.println(deck.toString()); 
+0

私はそれを念頭に置いていました! +1 –

+1

ありがとう、私は私の学生プロジェクトのためのポーカーを行ったばかりです:) – xenteros

+0

しかし、それは* cards *のリストに過ぎません。質問はカードのペア*を求めています。 –

関連する問題