01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
package algs12;
import stdlib.*;

public class XCard implements Comparable<XCard> {
  public static enum Rank {
    TWO("2"),
    THREE("3"),
    FOUR("4"),
    FIVE("5"),
    SIX("6"),
    SEVEN("7"),
    EIGHT("8"),
    NINE("9"),
    TEN("10"),
    JACK("J"),
    QUEEN("Q"),
    KING("K"),
    ACE("A");

    private final String name;
    private Rank (String name) { this.name = name; }
    public String toString () { return name; }
  }
  public static enum Suit {
    CLUBS("C"),
    DIAMONDS("D"),
    HEARTS("H"),
    SPADES("S");

    private final String name;
    private Suit (String name) { this.name = name; }
    public String toString () { return name; }
  }

  public Rank rank;
  public Suit suit;
  private XCard (Rank r, Suit s) { this.rank = r; this.suit = s; }
  public String toString () { return rank.toString () + suit.toString (); }
  public int compareTo (XCard that) {
    if (this.suit.compareTo (that.suit) < 0) return -1;
    if (this.suit.compareTo (that.suit) > 0) return +1;
    if (this.rank.compareTo (that.rank) < 0) return -1;
    if (this.rank.compareTo (that.rank) > 0) return +1;
    return 0;
  }
  /* 
   * NOTE: We don't need to override Object.equals 
   *  because there is only one possible instance of each card.
   *  But if you did do it, it would look like this:
   */
  //public boolean equals (Object that) {
  //  if (that == null)
  //    return false;
  //  if (this.getClass() != that.getClass())
  //    return false;
  //  XCard thatCard = (XCard) that;
  //  return (this.rank == thatCard.rank) && (this.suit == thatCard.suit);
  //}

  private static XCard[] protoDeck = new XCard[52];
  static { // This is how you run a loop to initialize a static variable.
    int i = 0;
    for (Suit s : Suit.values ())
      for (Rank r : Rank.values ()) {
        protoDeck[i] = new XCard (r, s);
        i++;
      }
  }
  public static XCard[] newDeck () {
    XCard[] deck = new XCard[protoDeck.length];
    for (int i = 0; i<protoDeck.length; i++)
      deck[i] = protoDeck[i];
    return deck;
  }

  public static void main (String[] args) {
    XCard[] d1 = XCard.newDeck ();  final XCard c1 = d1[51];
    XCard[] d2 = XCard.newDeck ();  final XCard c2 = d2[50];
    StdOut.println (c1 + (c1.equals(c2) ? " equals " : " does not equal ") + c2);
  }
}