2012-05-09 12 views
2

私は他のカード(カードゲーム)から継承しているクラスのカードを持っています。カードのスーツや数は、私の最初の問題は、カードのランクの順序を変更する方法である。このCollections.sort、Enum、Comparableインターフェイスの問題

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 
}; 

のように列挙体に格納されています。異なるカードゲームが異なるカード上で異なる重要度を置くので、クラスのクラスから継承するそれぞれの別々のクラス(カードゲーム)では、

私の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

私の最初の問題は、カードのランクの順序を変更する方法です。異なるカードゲームが異なるカード上で異なる重要度を置くので、クラスのクラスから継承するそれぞれの別々のクラス(カードゲーム)では、

  1. あなたはCardから継承しているので、あなただけに応じて動作するcompareToを上書きすることができます。

次の2つのアプローチがあります。

  • Comparatorインターフェイスを見ることができます。これは、コンテキストに基づいてオブジェクトの比較ルールを再定義するのに便利です。
  • このエラーについては、実際には意味をなさない。問題は他の場所にあるかもしれません。

    +0

    ええ、私はそれも意味をなさないと思った。しかし、ありがとう。私は何が間違っているかを理解するまでそれを見ていきます。 – Ester

    +1

    開発環境の設定によっては、コードの一部が 'Card'の古いコンパイル済みバージョンを使用している可能性があります。清潔でビルドしているかもしれません。 – trutheality

    0

    コードは正常に動作します。私はちょうどカードへの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(); 
        } 
    } 
    

    と - のみ当方の都合に、カードに内側の列挙型としてランクとスーツを追加しましたが、ただ一つのファイルにすべてを持っている - それはソートに影響を与えるべきではありません。ここではテストがある:

    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)); 
    

    カードの順序が異なる場合は、新しいカードクラスを作成するのが最も簡単な方法です。 Poker、Bridge、Rommee、Blackjackなどの間の類似点を考慮すると、より強力になる可能性があります。

    +0

    ありがとう。私はそれを試みたが、それは動作しません。それでも同じエラーが出ます。しかし、ありがとう:) – Ester

    +0

    @エスターしかし、私はそれをコンパイルして実行します。あなたのコードを混同している可能性がありますか?新しいものをコンパイルしますが、古いものは実行していますか?完全なコードを追加しました。 CardTest。 –

    2

    私は、構文エラーのためにあなたが

    public class Card implements Comparable<? extends Card> 
    

    (はい、私はこれは奇妙な構文であることに同意)としてカードを宣言するためにそしてあなたはサブクラスでオーバーライドすることができなければならないと思います。しかし、これはしばしば混乱することがわかります。さらに、設計上の観点からは、Bridge、Hearts、Pokerではカードがすべて同じです。おそらく、BridgeCardとPokerCardのサブクラスはありません。カードがありますが、別のゲームがあり、ゲームでカードの比較方法が決まります。追加明確にするために

    、そして、あなたが私のデザインの引数を信じるならば、よりよいデザインのため、同等の使用が、その代わりにコンパレータの束を実装していません。例えば何かのように:

    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... 
         } 
    }; 
    

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

    関連する問題