2

他のカード (カード ゲーム) が継承するクラス カードを取得しました。カードのスーツと番号は、次のように列挙型に格納されます

public static enum Suit {
    CLUBS, DIAMONDS, HEARTS, SPADES
};

public static enum Rank {
    DEUCE, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN, JACK, QUEEN, KING, ACE
};

私の最初の問題は、カードのランクの順序を変更する方法です。クラス Card から継承する各個別のクラス (カード ゲーム) では、異なるカード ゲームが異なるカードに異なるレベルの重要性を置きます。

私の 2 番目の問題は、Comparable Interface の使用です。

だから私はこのようなクラスカードを持っています:

public  class Card implements Comparable<Card> {

public Suit suit;
public Rank rank;


public Card(Rank ranker, Suit suiter) {

    rank = ranker;
    suit = suiter;
}


//Other Methods for rank and suit here. 


@Override
public int compareTo(Card o) {

    int rankCom = rank.compareTo(o.rank);
    return rankCom != 0 ? rankCom : suit.compareTo(o.suit);
}

}

私は最近、同等のインターフェースを紹介されたばかりで、私の実装が正しいかどうか完全には確信が持てません。collections.sort(cards_saver) を使用してカードを整理したいときに問題が発生します。cards_saver は、カードを保管する場所です。それはすべてうまくいきます。collections.shuffle(cards_saver) も正常に動作します。collections.sort を実行するときに発生する問題は次のとおりです。

Bound mismatch: The generic method sort(List<T>) of type Collections is not applicable for the arguments (List<Card>). The inferred type Card is not a valid substitute for the bounded parameter <T extends Comparable<? super T>>

私が持っているすべての余分なコードを載せたでしょう...これだけが長すぎます。問題を十分に説明していない場合は、コメントしてください。説明を試みます。

前もって感謝します

4

3 に答える 3

4

私の最初の問題は、カードのランクの順序を変更する方法です。クラス Card から継承する各個別のクラス (カード ゲーム) では、異なるカード ゲームが異なるカードに異なるレベルの重要性を置きます。

次の 2 つの方法があります。

  1. から継承しているので、それに応じて動作するようにCardオーバーライドできます。compareTo
  2. Comparatorコンテキストに基づいてオブジェクトの比較規則を再定義するのに便利なインターフェースを見てみましょう。

あなたが得ているそのエラーに関しては、それは本当に意味がありません。問題は別の場所にある可能性があります。

于 2012-05-09T00:38:59.827 に答える
2

構文エラーについては、 Card を次のように宣言する必要があると思います (はい、これは奇妙に見える構文であることに同意します)

public  class Card implements Comparable<? extends Card>

そして、サブクラスでオーバーライドできます。ただし、これはしばしば混乱を招くことがわかります。さらに、デザインの観点から、カードはブリッジ、ハーツ、ポーカーですべて同じです。おそらく、BridgeCard と PokerCard のサブクラスはありません。カードがありますが、別のゲームがあり、ゲームはカードをどのように比較するかを決定します。

より明確にするために、そして私の設計上の議論を信じるなら、より良い設計のために、 Comparable を使用しないでください。代わりにComparatorsの束を実装してください。例:

static Comparator<Card> LOWBALL_POKER_COMPARATOR = new Comparator<Card>() {

      @Override
      public int compare(Card o1, Card o2) {
         // Ace is LOW is lowball poker, other cards as usual
      }

};

static Comparator<Card> PINOCLE_COMPARATOR = new Comparator<Card>() {
      @Override
      public int compare(Card o1, Card o2) {
         // I haven't played pinocle in so long I forget the rules...
      }
};

Enum は Comparator を実装できるため、これらすべての Comparator を Enum に含めることができることに注意してください。プレイしている CardGame の特定のインスタンス/サブクラスは、起動時にそのゲームの適切な Enum/Comparator を選択します。

于 2012-05-09T00:53:19.240 に答える
0

あなたのコードは私にとってはうまくいきます。Card に toString メソッドを追加しました。

import java.util.*;

class Card implements Comparable<Card> {

    static enum Suit {
        CLUBS, DIAMONDS, HEARTS, SPADES
    }

    static enum Rank {
        DEUCE, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN, JACK, QUEEN, KING, ACE
    }

    public Suit suit;
    public Rank rank;

    public Card (Rank ranker, Suit suiter) {
        rank = ranker;
        suit = suiter;
    }

    @Override
    public int compareTo (Card o) {
        int rankCom = rank.compareTo(o.rank);
        return rankCom != 0 ? rankCom : suit.compareTo(o.suit);
    }

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

そして-私の便宜のために、カードに内部列挙としてランクとスーツを追加しましたが、すべてを1つのファイルに含めるだけです-並べ替えには影響しません。テストは次のとおりです。

public class CardTest
{
    public static void main (String args[])
    {
        List <Card> lc = new ArrayList <Card> ();
        lc.add (new Card (Card.Rank.SIX, Card.Suit.CLUBS)); 
        lc.add (new Card (Card.Rank.TEN, Card.Suit.CLUBS)); 
        lc.add (new Card (Card.Rank.SIX, Card.Suit.HEARTS)); 
        lc.add (new Card (Card.Rank.ACE, Card.Suit.HEARTS)); 

        System.out.println (lc);
        Collections.sort (lc);
        System.out.println (lc);
    }
}

出力:

[CLUBS  SIX, CLUBS  TEN, HEARTS SIX, HEARTS ACE]
[CLUBS  SIX, HEARTS SIX, CLUBS  TEN, HEARTS ACE]

あなたのコードは次のようになります。

        lc.add (new Card (Rank.TEN, Suit.CLUBS)); 

代わりは。

Card の順序が異なる場合は、新しい Card クラスを作成するのが最も簡単な方法かもしれません。Poker、Bridge、Rommee、Blackjack などの類似点を除外することは、やり過ぎになる可能性があります。

于 2012-05-09T00:50:33.557 に答える