Java 按套装对一副牌进行排序,然后排名

Java 按套装对一副牌进行排序,然后排名,java,algorithm,sorting,Java,Algorithm,Sorting,我有一个Java类: class Card { private Suit suit; private int rank; } (Suit是一个枚举) 有四套西服,每套军衔为1-9级,四套西服的军衔可能为0级。每一张卡片都存在于一个未知但不变的所有卡片中,并有一定的份数。我如何按照套装的顺序对一副牌进行排序,并通过增加每件套装的等级来排序 将Rank也设为枚举,您可以将已排序的组处理为: for (Suit suit : Suit.values()) f

我有一个Java类:

class Card
{
    private Suit suit;
    private int  rank;
}
Suit
是一个枚举)


有四套西服,每套军衔为1-9级,四套西服的军衔可能为0级。每一张卡片都存在于一个未知但不变的所有卡片中,并有一定的份数。我如何按照套装的顺序对一副牌进行排序,并通过增加每件套装的等级来排序

将Rank也设为枚举,您可以将已排序的组处理为:

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

请看一下在枚举上实现Comparable

您需要

  • 在卡片对象上实现接口:添加一个
    compareTo
    函数,该函数确定另一张卡片在排序顺序中应该在这张卡片之前还是之后
  • 实现一个对象,该对象接受两张卡片,并指示它们应以何种顺序出现

  • 然后您可以在列表中使用。

    使其实现
    可比较的接口。你只需要写一个方法。然后它们可以相互比较,并且您有许多现有的排序选项,例如静态
    数组。如果您有数组或
    集合,则排序
    。如果是任何类型的
    集合,则排序
    (列表、向量等)


    除了在
    卡上实现
    之外,您可能还必须对
    套装
    执行同样的操作,这取决于它是如何实现的。

    下面是一个卡类示例。如问题所述,诉讼将属于特定类别,而排名将是整数(在本例中,我没有实现排名验证)。实现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;
            }
        }
    
    }
    
    公共类卡实现可比性{
    私人西装;
    私人int cardRank;
    公开枚举诉讼{黑桃、俱乐部、心脏、钻石};
    公共卡(int cardRank、西服cardSuit){
    this.cardSuit=cardSuit;
    this.cardRank=cardRank;
    }
    /**
    *生成一张随机卡片
    */
    公共卡(){
    这个((int)(Math.random()*9),SUIT.values()[(int)(Math.random()*SUIT.values().length)];
    }
    公共字符串getSuit(){
    返回cardSuit.toString();
    }
    public int getRank(){
    返回cardRank;
    }
    @凌驾
    公共内部比较(Card2 o){
    if(this.cardRank==o.cardRank){
    将此.cardSuit.compareTo(o.cardSuit)返回到(o.cardSuit);
    }否则{
    返回o.cardRank-this.cardRank;
    }
    }
    }
    
    完成这项任务的一个快速方法是。设置一组卡片价值列表,然后在牌组中穿行,在遇到每张卡片时将其放入相应的列表中。然后将所有列表合并到一个部分排序的组中。现在做同样的事情,只需要一系列的西装。将所有列表合并在一起,您应该拥有一个已排序的组。

    哦,来吧!康斯坦丁:如果我把我的家庭作业经验应用到这里,我会简单地用西装分开一副牌,并对每一副牌使用我最喜欢的快速排序,但这是一个过于严肃的项目,不能依赖学术经验。是否有任何项目如此严肃,以至于需要一个人回避学术经验?这不是矛盾修饰法吗?我想他有一副现有的牌,不应该创造一副新的。我想我会把它作为练习留给他。一旦你有了作为枚举的等级和适合度,这就非常简单了。其他答案解决了这个问题。您好,请您详细解释一下
    o.cardRank-this.cardRank
    ,为什么要减去这两个实例变量?我完全迷路了。