解答例 - j2.lesson04.card.CardDeck

package j2.lesson04.card;

import java.util.Collections;
import java.util.LinkedList;
import java.util.NoSuchElementException;
import java.util.Random;

/**
 * トランプ一式を表すクラス。
 @author arakawa
 @version $Id: CardDeck_java.rps,v 1.1 2006/03/06 12:56:15 java2005 Exp $
 */
public class CardDeck {
    
    private final LinkedList deck;
    
    /**
     * トランプ一式を作成する。
     * 初期状態では、スペードA,2..K,ダイヤA,2,..,K,クラブA,2,..,K,ハートA,2,..,Kの順に並んでいる。
     */
    public CardDeck() {
        super();
        this.deck = new LinkedList();
        for (int i = 1; i <= 13; i++) {
            this.deck.add(new Card(Card.SPADE, i));
        }
        for (int i = 1; i <= 13; i++) {
            this.deck.add(new Card(Card.DIAMOND, i));
        }
        for (int i = 1; i <= 13; i++) {
            this.deck.add(new Card(Card.CLUB, i));
        }
        for (int i = 1; i <= 13; i++) {
            this.deck.add(new Card(Card.HEART, i));
        }
    }
    
    /**
     * このデッキをシャッフルする。
     */
    public void shuffle() {
        shuffle(System.currentTimeMillis());
    }
    
    /**
     * このデッキにカードが残っているかどうか調べる。
     @return カードが残っていれば <code>true</code>
     */
    public boolean isEmpty() {
        return this.deck.isEmpty();
    }
    
    /**
     * このデッキに残っているカードの枚数を取得する。
     @return 残っているカードの枚数
     */
    public int rest() {
        return this.deck.size();
    }
    
    /**
     * デッキの先頭からカードを一枚取得する。
     * 取得したカードは、デッキから削除される。
     @return デッキの先頭にあるカード
     */
    public Card takeFirst() {
        if (isEmpty()) {
            throw new NoSuchElementException();
        }
        return (Cardthis.deck.removeFirst();
    }
    
    /**
     * デッキの末尾からカードを一枚取得する。
     * 取得したカードは、デッキから削除される。
     @return デッキの末尾にあるカード
     */
    public Card takeLast() {
        if (isEmpty()) {
            throw new NoSuchElementException();
        }
        return (Cardthis.deck.removeLast();
    }
    
    /**
     * 指定したカードを、デッキの先頭に追加する。
     @param c デッキに追加するカード
     */
    public void putFirst(Card c) {
        this.deck.addFirst(c);
    }
    
    /**
     * 指定したカードを、デッキの末尾に追加する。
     @param c デッキに追加するカード
     */
    public void putLast(Card c) {
        this.deck.addLast(c);
    }
    
    /**
     * カードを指定した乱数の種を用いてシャッフルする。
     * 同じデッキに対して同じ乱数の種でこのメソッドを呼び出した場合、結果は同じになる。
     @param seed 乱数の種
     */
    public void shuffle(long seed) {
        Collections.shuffle(this.deck, new Random(seed));
    }
}