2016-04-28 2 views
0

私はほとんどすべてを自分のポーカーゲームの準備ができています。私が次にやりたいことは、プレイヤーのカードをランク​​値でソートすることです。あなたはバイト2である "2" を知っている、 "3" は、私がへの道を見つける必要があり、私の列挙CardRankクラスHandオブジェクト内のカードオブジェクトを並べ替える

public enum CardRank { 
    TWO((byte)2, "Two"), 
    THREE((byte)3, "Three"), 
    FOUR((byte)4, "Four"), 
    FIVE((byte)5, "Five"), 
    SIX((byte)6, "Six"), 
    SEVEN((byte)7, "Seven"), 
    EIGHT((byte)8, "Eight"), 
    NINE((byte)9, "Nine"), 
    TEN((byte)10, "Ten"), 
    JACK((byte)11, "Jack"), 
    QUEEN((byte)12, "Queen"), 
    KING((byte)13, "King"), 
    ACE((byte)14, "Ace"); 

    private final byte rankValue; 
    private final String rankValueName; 

    //Constructor 
    private CardRank(byte rankValue, String rankValueName){ 
     this.rankValue=rankValue; 
     this.rankValueName = rankValueName; 
    } 

    //reusable methods 
    protected byte getRankValue(){ 
     return rankValue; 
    } 

    protected String getRankValueName(){ 
     return rankValueName; 
    } 
} 

CardsOutput

CardRankOutput

これはバイト3等... です列挙型の値を使用してソートしますが、正直言って私は実際にどのようにしているのか分かりません。 このメソッドはプレイヤーの手のカードの列挙型の値を返します。

protected void sortHand(){ 
    for (Hand playerHand: players){ 
     i = 0; 
     while(i<5){ 
      System.out.println(playerHand.cards.get(i).getRankValue()); 
      i++; 
     } 
    } 
} 

私は非常に明白な理由からコレクションを使用することはできません:タイプコレクションで 方法ソート(リスト)の引数には適用されません(手を)

そして、これは私の手のクラス

import java.util.ArrayList; 

    public class Hand { 

     protected ArrayList<Card> cards; 
     private String handCards; 

     // Constructor 
     protected Hand() { 
      cards = new ArrayList<Card>(5); 
     } 

     // reusable methods 

     protected void add(Card card) { 
      cards.add(card); 
     } 

     protected void emptyHand() { 
      cards.clear(); 
     } 

     protected void flipHandCards() { 
      for (Card card : cards) { 
       card.flipCard(); 
      } 
     } 

     protected String displayHand() { 
      handCards = ""; 
      for (Card i : cards) { 
       handCards += i.toString() + "\n"; 
      } 
      return handCards; 
     } 

     protected boolean giveCard(Card card, Hand differentHand) { 
      if (!cards.contains(card)) { 
       return false; 
      } else { 
       cards.remove(card); 
       differentHand.add(card); 
       return true; 
      } 
     } 
    } 

であり、これは私のカードのクラスである

public class Card { 

    private CardSuit suit; 
    private CardRank rank; 
    private String cardName; 
    private boolean visibility; 

    //Constructor 
    protected Card(CardRank rank, CardSuit suit){ 
     this.rank = rank; 
     this.suit = suit; 
    } 

    //reusable methods 
    protected String getCardSuit(){ 
     return suit.getCardSuit(); 
    } 

    protected byte getRankValue(){ 
     return rank.getRankValue(); 
    } 
    protected void flipCard(){ 
     visibility = !visibility; 
    } 

    public String toString(){ 
     if (visibility){ 
      cardName=""; 
      cardName+=rank.getRankValueName() + " of " + suit.getCardSuit(); 
     } 
     else{ 
      cardName = "You cannot see your opponents card"; 
     } 
     return cardName; 
    } 
} 

ヘルプ。私は正しい方向に私を導く助けを感謝します。

+0

'Card'クラスを質問に追加してください。 – SarathChandra

答えて

0

Guava(Google Collections)を使用することはできませんが、これは額面で間違っているようです。カード(ArrayList)と対話できるソート方法を手に入れてください。あなたがリストをソートできるようになるComparableをを実装カードを作りそこからHand.java

public class Hand { 
    ... 

    public List<Card> getSortedCards() { 
     Collections.sort(cards); 
     return cards; // Consider deep copying. 
    } 
} 

protected void sortHand(){ 
    for (Hand playerHand: players){ 
     List<Card> sortedHand = playerHand.getSortedCards(); 
     // Do whatever 
    } 
} 

、。

Card.java

public class Card implements Comparable<Card> 
{ 
    ... 

    @Override 
    public int compareTo(Card o) { 
     if (this.rank.getRankValue() < o.rank.getRankValue()) { 
      return -1; 
     } 
     else if (o.rank.getRankValue() < this.rank.getRankValue()) { 
      return 1; 
     } 
     return 0; 
    } 
} 
+0

コレクションの型sort(List )は引数には当てはまりません(ArrayList )は私と同じ問題を返しますが、ではなく Matt

+0

カードは、Comparableインターフェイスを実装し、compareTo()の実装を持つか、Comparatorクラスを作成して** Collections.sort(List 、Comparator )**シグニチャを使用する必要があります。 – Ironcache

+0

答えを明確にするように更新しました。 – Ironcache

0
protected void sortHand(){ 
    for (Hand playerHand: players){ 
     i = 0; 
     int []arr = new int[5]; 
     while(i<5){ 
      System.out.println(playerHand.cards.get(i).getRankValue()); 
      arr[i] = playerHand.cards.get(i).getRankValue(); 
      i++; 
     } 
     Arrays.sort(arr); 
    } 
} 

あなたは配列にそれを追加してみてくださいとArray.sort()を呼び出すことができます。ここでは、getRankvalueがintを返すと仮定します。これを試してください

+0

はい、それは私が知っているが、私は新しい値を作成した配列を整数でソートする代わりに、これらの値を使ってカードをソートする必要があります。何か案は? – Matt

+0

あなたの 'players'はそのコレクションの型ですか? – Priyamal

0

のArrayListを容易Comparatorを使用してソートすることができます。私はあなたが手にカードを格納するための静的な配列を使用することをお勧め

cards.sort(new Comparator<Card>() { 
    @Override 
    public int compare(Card card1, Card card2) { 
     // return -1 if card1 should come before card2 
     // return 0 if card1 and card2 have equal values 
     // return 1 if card1 should come after card2 
    } 
}); 
0

:あなたは、このような何かを得るでしょう

public class Hand { 
    private static final int MAX_CARD = 5;//modify with your value 

    protected Card[] cards; 
    private int currentCardNumber; 
    private String handCards; 

    // Constructor 
    protected Hand() { 
     cards = new Card[MAX_CARD]; 
     currentCardNumber = 0; 
    } 

    // reusable methods 

    protected void add(Card card) { 
     if (currentCardNumber == MAX_CARD - 1) { return; } 
     cards[currentCardNumber] = card; 
     currentCardNumber++; 
    } 

    protected void emptyHand() { 
     for (int i = 0; i < MAX_CARD; i++) { 
      cards[i] = null; 
     } 
     currentCardNumber = 0; 
    } 

    protected void flipHandCards() { 
     for (int i = 0; i < currentCardNumber; i++) { 
      cards[i].flipCard(); 
     } 
    } 

    protected String displayHand() { 
     handCards = ""; 
     for (int i = 0; i < currentCardNumber; i++) { 
      handCards += cards[i].toString() + "\n"; 
     } 
     return handCards; 
    } 
    protected boolean giveCard(Card card, Hand differentHand) { 
     int index = getCardIndex(card); 
     if (index == -1) { 
      return false; 
     } else { 
      differentHand.add(remove(index)); 
      return true; 
     } 
    } 

    protected void sortHand() { 
     for(int i = 0; i < currentCardNumber; i++) { 
      for(int j = i + 1; j < currentCardNumber; j++) { 
       if(cards[j].getRankValue() < cards[i].getRankValue()) { 
        Card tmp = cards[j]; 
        cards[j] = cards[i]; 
        cards[i] = tmp; 
       } 
      } 
     } 
    } 

    private int getCardIndex(Card card) { 
     for (int i = 0; i < currentCardNumber; i++) { 
      if(card.equals(cards[i]) { 
       return i; 
      } 
     } 
     return -1; 
    } 

    private Card remove(int cardIndex) { 
     if (currentCardNumber == 0) { return null; } 
     Card tmp = cards[cardIndex]; 
     for (int i = cardIndex + 1; i < currentCardNumber; i++) { 
      cards[i - 1] = cards[i]; 
     }    
     cards[currentCardNumber - 1] = null; 
     currentCardNumber--; 
     return tmp; 
    } 
} 

それとも、独自のリストを作成し、独自の並べ替えを適用することができます方法。

関連する問題