0

ArrayList FullDeckArray を出力して、デッキに 52 枚のカードと値がすべて含まれているかどうかを確認したいと思います。

これは私のカードとデッキのクラスです。

package blackjack;

/**
 *
 * @author mvisser
 */
public class Card 
{

   private int rank;
   private int suit;

   public String tostring(Card card1)
   {

      String result = "";

      if (rank == 1) {
          result = "Ace";
      }
      if (rank == 2) {
          result = "Two";    
      }
      if (rank == 3) {
          result = "Three";

      }
      if (rank == 4) {
          result = "Four";   
      }
      if (rank == 5) {
          result = "Five";

      }
      if (rank == 6) {
          result = "Six";

      }
      if (rank == 7) {
          result = "Seven";

      }
      if (rank == 8) {
         result = "Eight";      
      }
      if (rank == 9) {
         result = "Nine";  
      }
      if (rank == 10) {
         result = "Ten";     
      }
      if (rank == 11) {
         result = "Jack";     
      }
      if (rank == 12) {
            result = "Queen";   
      }
      if (rank == 13) {
            result = "King";     
      }
      if (suit == 1) {
          result = result + " of Clubs ";
      }
      if (suit == 2) {
         result = result + " of Diamonds ";
      }
      if (suit == 3) {
          result = result + " of Hearts ";
      }
      if (suit == 4) {
          result = result + " of Spades ";
      }

      return result;

   }

   public Card(int rank, int suit) 
   {
        this.rank = rank;
        this.suit = suit;    
   }
}

私の Deck クラスでわかるように、私は ArrayList FullDeckArray を持っています。私がしたいのはそれを
印刷することだけなので、どのような値が戻ってくるかを見てください。

public class Deck 
{
//     private Card[][] fullDeck = new Card[0][0];
     private Random shuffle = new Random();
     public ArrayList<Card> FullDeckArray = new ArrayList<Card>();

//     private int numberOfCards = 52;

   public Deck()
   {


    for (int rank = 1; rank <= 13; rank++) {

            for (int suit = 1; suit <= 4; suit++)
            {
               FullDeckArray.add(new Card(rank, suit));


            }
        }
   }        

    public void shuffle() {
        Collections.shuffle(FullDeckArray);   
    }

    public Card DrawCard() {
        int cardPosition = shuffle.nextInt(FullDeckArray.size()+1);
        return FullDeckArray.remove(cardPosition);
    }

     public int TotalCards() {
            return FullDeckArray.size();
     }

     public void test() {
            System.out.println( ArrayList<Card>( FullDeckArray ) );
     }
}
4

4 に答える 4

1

私は列挙型を使用しenum.values()ます。メソッドを使用すると、列挙型のすべての値を簡単にループできます。

public class Card {
    public enum Rank { 
        ACE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN, JACK, QUEEN, KING;
        public String toString() {
            switch(this) {
            case ACE: return "Ace";
            case TWO: return "Two";
            case THREE: return "Three";
            case FOUR: return "Four";
            case FIVE: return "Five";
            case SIX: return "Six";
            case SEVEN: return "Seven";
            case EIGHT: return "Eight";
            case NINE: return "Nine";
            case TEN: return "Ten";
            case JACK: return "Jack";
            case QUEEN: return "Queen";
            case KING: return "King";
            default: return "ERROR: no valid rank"; 
            }
        }
    }
    public enum Suit { 
        CLUBS, DIAMONDS, HEARTS, SPADES;
        public String toString() {
            switch(this) {
            case CLUBS: return "Clubs";
            case DIAMONDS: return "Diamonds";
            case HEARTS: return "Hearts";
            case SPADES: return "Spades";
            default: return "ERROR: no valid suit";
            }
        }
    }
    private Rank rank;
    private Suit suit;

    public Card(Rank rank, Suit suit) {
        this.rank = rank;
        this.suit = suit;
    }

    public String toString() {
        return rank.toString() + " of " + suit.toString();
    }

    public boolean equals(Object other) {
        if (!(other instanceof Card)) return false;
        Card card = (Card) other;
        if (card.rank == this.rank && card.suit == this.suit) return true;
        return false;
    }
}

デッキ クラスでは、次の単純なループですべてのカードを追加します。

public void fill() {
    for (Rank rank : Card.Rank.values()) {
        for (Suit suit : Card.Suit.values()) {
            Card card = new Card(rank, suit)
            cards.add(card);
            System.out.println(card.toString());
        }
    }
}

残りのデッキ クラスは維持できます。

カードが 1 回だけ追加されていることを確認したい場合は、HashSet を使用できます。セットでは、オブジェクトは 1 回しか発生しません (ただし、equals()メソッドが必要です)。

HashSet<Card> set = new HashSet<Card>(cards);
cards = new ArrayList<Card>(set);

その後、「cards.size()」でサイズを確認できます。

更新: Card での配列の使用を回避し、列挙型を回避するためのコードを次に示します。

public class Deck {
    private Random shuffle = new Random();
    public ArrayList<Card> fullDeck = new ArrayList<Card>();

    public Deck() {
        for (int rank = 1; rank <= 13; rank++) {
            for (int suit = 1; suit <= 4; suit++) {
                fullDeck.add(new Card(rank, suit));
            }
        }
    }

    public void print() {
        String deckOutput = "";
        for (Card card : fullDeck) {
            deckOutput += card.toString() + "\n";
        }
        System.out.println(deckOutput);
    }

    public static void main(String[] args) {
        Deck deck = new Deck();
        deck.print();
    }
}

カードの場合は、これを使用します。

public class Card {
    private int rank;
    private int suit;

    public Card(int rank, int suit) {
        this.rank = rank;
        this.suit = suit;
    }

    public String toString() {
        String Srank = "", Ssuit = "";
        switch(rank) {
            case 1: Srank = "Ace"; break;
            case 2: Srank = "Two"; break;
            case 3: Srank = "Three"; break;
            case 4: Srank = "Four"; break;
            case 5: Srank = "Five"; break;
            case 6: Srank = "Six"; break;
            case 7: Srank = "Seven"; break;
            case 8: Srank = "Eight"; break;
            case 9: Srank = "Nine"; break;
            case 10: Srank = "Ten"; break;
            case 11: Srank = "Jack"; break;
            case 12: Srank = "Queen"; break;
            case 13: Srank = "King"; break;
        }
        switch(suit) {
            case 1: Ssuit = "Clubs"; break;
            case 2: Ssuit = "Diamonds"; break;
            case 3: Ssuit = "Hearts"; break;
            case 4: Ssuit = "Spades"; break;
        }
        return Srank + " of " + Ssuit;
    }
}

テストするには、上記の HashMap/ArrayList メソッドを引き続き使用して (Card にも equals メソッドを実装する場合のみ)、fulldeck.size()52 枚のカードがあるかどうかを確認できます (HashMap のためにすべて異なります)。

于 2012-11-05T14:04:02.153 に答える
0

これを試してみてください

public class DeckTest{
    public static void main(String []args){
        System.out.println(new Deck().FullDeckArray);
    }
}

クラスCardは以下のコードのようになります

 public class Card 
    {

       private int rank;
       private int suit;


       public String tostring()
       {

          String result = "";

          if (rank == 1) {
              result = "Ace";
          }
          if (rank == 2) {
              result = "Two";    
          }
          if (rank == 3) {
              result = "Three";

          }
          if (rank == 4) {
              result = "Four";   
          }
          if (rank == 5) {
              result = "Five";

          }
          if (rank == 6) {
              result = "Six";

          }
          if (rank == 7) {
              result = "Seven";

          }
          if (rank == 8) {
             result = "Eight";      
          }
          if (rank == 9) {
             result = "Nine";  
          }
          if (rank == 10) {
             result = "Ten";     
          }
          if (rank == 11) {
             result = "Jack";     
          }
          if (rank == 12) {
                result = "Queen";   
          }
          if (rank == 13) {
                result = "King";     
          }
          if (suit == 1) {
              result = result + " of Clubs ";
          }
          if (suit == 2) {
             result = result + " of Diamonds ";
          }
          if (suit == 3) {
              result = result + " of Hearts ";
          }
          if (suit == 4) {
              result = result + " of Spades ";
          }

          return result;

       }

       public Card(int rank, int suit) 
       {
            this.rank = rank;
            this.suit = suit;    
       }
    }
于 2012-11-05T12:57:58.617 に答える
0

次のように tostring メソッドをオーバーライドする必要があります。

@override
public String toString(Card card1){
.....
}

arraylist 名を System.out.println() に渡すだけです。配列リストの型は必要ありません。

お役に立てれば...

于 2012-11-05T13:22:00.400 に答える
0

これを行うには、静的テストと動的テストの 2 つの方法があります。静的はより単純でエラーが発生しにくいですが、プログラムのこの部分が適切に動作することを確認してから残りの部分に進む以外の目的で実行することはできません。動的テストは少し複雑ですが、必要なときにいつでもデッキをテストできます (ユーザーが何らかの方法でデッキを変更し、それを検証する必要がある場合など)。

静的試験

静的テスト方法とこれを行う最も簡単な方法は、デッキ内のすべてのカードを印刷して手動で検証することです。そのためには、まず追加と修正を行う必要があります。まず、クラス内のtostringメソッドのシグネチャを変更して、パラメーターなしの " " にする必要があります。これは、オブジェクトを String に自動的に変換するobject メソッドをオーバーライドします。次に、クラスでオーバーライドする必要があります。CardtoString()toString()toString()Deck

@Override
public void toString() {
    StringBuilder sb = new StringBuilder();
    for(Card card : FullDeckArray) {
        sb.append(card);  // calls Card class's toString() method automatically.
        sb.append('\n');  // newline character after each card
    }
    return sb.toString();
}

あとは、Deck の toString() メソッドを使用するだけです。

public void test() {
    System.out.println(this);  // calls Deck class's toString() method automatically
}

動的テスト

動的にテストするのはもう少し複雑ですが、それほど複雑ではありません。これをテストするには、どのように手動で実行しますか? 紛失したカードや重複したカードを探します。そのようなことをテストする良い方法はセットです。ただし、Sets を使用する前に、まずhashCode()equals()メソッドをオーバーライドして、Card クラスが一意であると見なされる方法を再定義する必要があります。ランクとスーツの両方が一致する場合にのみ、カードは別のカードと等しくなります。

したがって、これらを Card クラスに追加します。

@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + rank;
    result = prime * result + suit;
    return result;
}

@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    Card other = (Card) obj;
    if (rank != other.rank)
        return false;
    if (suit != other.suit)
        return false;
    return true;
}

これで、実際のロジックに進みます。簡単なテストは次のようになります。

For each card in your deck
    If card is not in set
        Add card to set
    Else
        Flag not valid!  Duplicate card!

If set does not have exactly 52 cards
    Flag not valid!  Extra or missing cards!

したがって、コードは次のようになります。

  public boolean test() {
      boolean valid = true;
      Set<Card> cardSet = new HashSet<Card>();
      for(Card card : FullDeckArray) {
          if(!cardSet.contains(card)) {
              cardSet.add(card);
          } else {
              valid = false;
          }
      }
      if(cardSet.size() != 52) {
         valid = false;
      }
      return valid;
  }

また、enums の使用については、こちらを参照してください。コードを読みやすくするだけでなく、クラスのようにメソッドを追加したり、クラスのようにメソッドを追加したりすることもできますtoString()。Java 用の適切なテスト ライブラリについては、 jUnitも参照してください。

于 2012-11-05T13:09:20.373 に答える