import java.util.*;
public class CardDrawer {
Card[] cards;
Random seed = new Random();
List<Card> cardsDrawn = new ArrayList<Card>();
boolean drawOnce = false;
CardDrawer(boolean drawOnce) {
this();
this.drawOnce = drawOnce;
}
CardDrawer() {
initCards(1, 14);
}
CardDrawer(int low, int high, boolean drawOnce) {
this(low, high);
this.drawOnce = drawOnce;
}
CardDrawer(int low, int high) {
initCards(low, high);
}
public Card drawCard() {
return getCard();
}
public Card[] drawCard(int n) {
Card[] draws = new Card[n];
for(int j = 0; j < n; j++) {
draws[j] = getCard();
}
return draws;
}
private Card getCard() {
Card card;
boolean drawAgain = true;
do {
card = cards[seed.nextInt(cards.length)];
drawAgain = drawOnce ? cardsDrawn.contains(card)
: false;
} while(drawAgain);
if(drawOnce)
cardsDrawn.add(card);
return card;
}
private void initCards(int low, int high) {
String[] faces = { "jack", "queen", "king", "ace" };
String[] suits = { "spades", "hearts", "clubs", "diamonds" };
int len = high - low + 1;
cards = new Card[4*len];
int count = 0;
for(int j = 0; j < len; j++) {
for(int k = 0; k < suits.length; k++) {
cards[count++] = new Card(low+j, suits[k]);
}
}
}
/** Test this class. */
public static void main(String[] args) {
CardDrawer cd1 = new CardDrawer();
Card[] cards = cd1.drawCard(5);
System.out.printf("cd1 cards = %s%n", Arrays.toString(cards));
CardDrawer cd2 = new CardDrawer(10, 14, true);
cards = cd2.drawCard(5);
System.out.printf("cd2 cards = %s%n", Arrays.toString(cards));
System.out.println("-------------");
CardDrawer cd3 = new CardDrawer(false);
cards = cd3.drawCard(20);
System.out.println("cd3 card duplicates:");
Card[] uniqueCards = getUniqueCards(cards);
List<Card> cardList = new ArrayList<Card>(Arrays.asList(cards));
for(int j = 0; j < uniqueCards.length; j++) {
int freq = Collections.frequency(cardList, uniqueCards[j]);
if(freq > 1)
System.out.println(uniqueCards[j] + " occurs " +
freq + " times");
}
System.out.println("-------------");
System.out.println("cardList = " + cardList);
}
private static Card[] getUniqueCards(Card[] cards) {
List<Card> list = new ArrayList<Card>();
for(int j = 0; j < cards.length; j++) {
if(!list.contains(cards[j]))
list.add(cards[j]);
}
return list.toArray(new Card[list.size()]);
}
}
class Card {
int value;
String suit;
Card(int value, String suit) {
this.value = value;
this.suit = suit;
}
public String toString() {
String[] vals = { "jack", "queen", "king", "ace" };
String s;
if(value > 10)
s = vals[value-11];
else
s = String.valueOf(value);
return s + " of " + suit;
}
}