按套装排序一副牌,然后排名

时间:2011-01-10 18:21:42

标签: java algorithm sorting

我有这个Java类:

class Card
{
    private Suit suit;
    private int  rank;
}

Suit是一个枚举)

有四种套装,每种等级为1-9,四种套装有一种可能的等级0.每张卡片都存在未知但在所有卡片中的数量不变。我如何按照套装的顺序对牌组进行排序,并通过增加每套牌的等级?

6 个答案:

答案 0 :(得分:3)

你需要

  1. 在卡片对象上实现Comparable接口:添加一个compareTo函数,用于确定在排序顺序中此卡之前或之后是否应该使用另一张卡
  2. 实现一个Comparator对象,该对象接受两张牌并指出它们应该在
  3. 中出现的顺序

    然后您可以在列表中使用Collections.sort

答案 1 :(得分:2)

使Rank也是一个枚举,你可以这样处理一个排序的套牌:

    for (Suit suit : Suit.values())
        for (Rank rank : Rank.values())
            deck.add(new Card(rank, suit));

答案 2 :(得分:2)

看看在枚举上实现Comparable。

答案 3 :(得分:1)

使其实现Comparable接口。 Theres只需要编写一种方法。然后可以将它们相互比较,并且您有许多现有的排序选项,例如,如果您有数组,则为静态Arrays.sort;如果有任何类型的Collections.sort,则为Collection(列表,矢量等)

除了在Card上实施之外,您可能必须对Suit执行相同操作,具体取决于其完成方式。

答案 4 :(得分:0)

这是卡类的一个例子。正如问题所述,诉讼将属于特定类别,而等级将是整数(在此示例中,我没有实现等级验证)。实现Comparable类允许Card类比较另一个Card类。这样就可以对一组/一组卡片进行排序。

public class Card implements Comparable<Card>{

    private SUIT cardSuit;
    private int cardRank;

    public enum SUIT {SPADE, CLUB, HEART, DIAMOND};

    public Card(int cardRank, SUIT cardSuit) {
        this.cardSuit = cardSuit;
        this.cardRank = cardRank;
    }

    /**
     * Generates a random card
     */
    public Card(){
        this((int) (Math.random() * 9) , SUIT.values()[(int) (Math.random() * SUIT.values().length)]);
    }

    public String getSuit() {
        return cardSuit.toString();
    }

    public int getRank() {
        return cardRank;
    }

    @Override
    public int compareTo(Card2 o) {
        if (this.cardRank == o.cardRank) {
            return this.cardSuit.compareTo(o.cardSuit);
        } else {
            return o.cardRank - this.cardRank;
        }
    }

}

答案 5 :(得分:0)

完成此任务的快速方法是Radix Sort。设置一系列卡片值列表,然后浏览您的卡片组,在遇到卡片时将每张卡片放入相应的列表中。然后将所有列表合并到一个部分排序的套牌中。现在做同样的事情,只有一系列西装列表。合并所有列表,你应该有一个排序的套牌。