【问题标题】:Sorting Card objects inside of the Hand object对 Hand 对象内的 Card 对象进行排序
【发布时间】:2016-04-29 01:21:28
【问题描述】:

我已经为我的扑克游戏准备好了一切。我接下来要做的是按排名值对玩家手中的牌进行排序。你知道“二”是字节 2,“三”是字节 3 等等...... 这是我的枚举 CardRank 类

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

我需要找到一种使用枚举值对它们进行排序的方法,但老实说,我真的不知道该怎么做。 该方法返回玩家手牌的枚举值:

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

我不能使用 Collections 的原因很明显: Collections 类型中的方法 sort(List) 不适用于参数 (Hand)

这是我的手课

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

帮助。感谢您提供的任何帮助,引导我走向正确的方向。

【问题讨论】:

  • 请将Card 类添加到问题中。

标签: java sorting poker


【解决方案1】:

说您不能为此使用 Guava (Google Collections) 在表面上似乎是不正确的。只需给 hand 一个排序方法,让它与卡片交互(这是一个 ArrayList)。

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

Hand.java

public class Hand {
    ...

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

从那里开始,让 Card 实现 Comparable 会让你对列表进行排序。

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

【讨论】:

  • Collections 类型中的方法 sort(List) 不适用于参数 (ArrayList) 返回与我相同的问题,但对于 而不是
  • Card 要么需要实现 Comparable 接口并具有 compareTo() 的实现,要么您需要创建一个 Comparator 类并使用 Collections.sort(List, Comparator) 代替签名。
  • 更新了答案以澄清。
  • 嗯,我以前从未做过 Comparator。而这个扑克游戏是我迄今为止最先进的程序。所以我真的不知道该怎么做。问题是我对编程很陌生,因为我刚开始不久,所以可能还有很多空白要填补。
  • 基本上,Collections.sort() 需要知道如何 对列表进行排序。默认情况下(使用 Collections.sort(List) 签名),T 需要具有可比性,它将使用 compareTo() T 中的 b> 方法来确定如何对数据进行排序。这是最好的路线;它提供了一种默认的比较方法。如果您希望使用非默认排序方法,或者您可能希望使用几种不同的方式对数据进行排序,则创建单独的比较器是一个更好的选择。
【解决方案2】:
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 。试试这个

【讨论】:

  • 是的,我知道它会起作用,但我需要使用这些值对卡片进行排序,而不是使用整数对新创建的数组进行排序。有什么想法吗?
  • 所以你的players 是一个列表,它的集合类型是什么
【解决方案3】:

ArrayLists 可以使用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
    }
});

【讨论】:

    【解决方案4】:

    我建议你使用静态数组来存储手牌:

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

    或者您可以创建自己的列表并应用您自己的排序方法。

    【讨论】:

      猜你喜欢
      • 2023-03-21
      • 2011-10-04
      • 1970-01-01
      • 2013-12-05
      • 1970-01-01
      • 2018-08-18
      • 1970-01-01
      • 1970-01-01
      • 2021-09-19
      相关资源
      最近更新 更多