首页 文章

用Java实现卡片组

提问于
浏览
0

所以我有一个实验室(我们被允许寻求外界的帮助,所以我在这里经过大量的努力)我们必须实施一副卡片 . 我们必须使用枚举类来创建num

适合西装:

public enum Suits {
CLUBS, HEARTS, DIAMONDS, SPADES

}

对于数字:

public enum Numerals {
DEUCE(2), THREE(3), FOUR(4), FIVE(5), SIX(6), SEVEN(7), EIGHT(8), NINE(9), 
TEN(10), JACK(11), QUEEN(12), KING(13), ACE(14);

}

我的卡类很简单,但我不确定这两个代码块:

public int compareTo (Card aCard){
    if (aCard.aNumeral.equals(this.aNumeral) && aCard.aSuit.equals(this.aSuit)){
        return 0;
    }
    else {
        return -1;
    }
}

public boolean equals (Card aCard){
    if (this.compareTo(aCard) == 0){
        return true;
    }
    else {
        return false;
    }
}

现在是棘手的部分......甲板......

所以我们必须使用Cloneable,Iterable和Comparator来实现这个套牌,所以这就是我到目前为止所做的,而且无法弄清楚要做什么 .

import java.util.ArrayList;
import java.util.Comparator;
import java.util.Iterator;

public class Deck implements Cloneable, Iterable<Card>, Comparator<Card> {

private ArrayList<Card> cards;

public Deck (){
    for (Card c : cards){


    }

}

我正在努力甚至把构造函数放在一起 . 我打算使用ArrayList来“保存”52个已排序的卡片(如你所见);但我们必须最终返回一个已排序的牌组 . 关于去哪里的任何建议?

3 回答

  • 1

    要回答有关 compareTo 的问题: a.compareTo(b) 如果 a 小于 b 则应返回负数,如果 a 大于 b 则返回正数,如果're equal. Also, if you'重新排序对象则返回0,排序应遵循的规则之一是如果 a.compareTo(b) < 0 ,然后 b.compareTo(a) > 0 . (你不能同时拥有“ a 小于 b " and " b 小于 a ”) . 你的 compareTo ,只要卡不是't equal, doesn'就会按照这个规则返回 -1 . 要解决这个问题,您需要决定订购 . "sorted deck"是什么样的?可能所有的俱乐部都在一起,其次是所有的钻石等,这意味着任何俱乐部卡都会比任何钻石卡少 . 要正确执行此操作,您需要首先比较套装,并且仅在套装相等时才进行比较:

    public int compareTo (Card aCard){
        int suitCompare = this.aSuit.compareTo(aCard.aSuit);
        if (suitCompare != 0)  {
            return suitCompare;
        }
        return this.aNumeral.compareTo(aCard.aNumeral);
    }
    

    每个 enum 上的 compareTo 将返回 <00>0 . 所以你可以比较套装,返回一个 <0>0 的值,然后比较套装是否相等 . 这是编写需要检查多个数据的任何 compareTo 方法的一般方法 .

  • 1

    如果您使用像eclipse这样的ide,它会告诉您需要为接口实现哪些方法:

    import java.util.*;
    class Card {}
    class Deck implements Cloneable,Iterable<Card>,Comparator<Card> {
        public Deck() {}
        @Override public int compare(Card arg0,Card arg1) {
            // TODO Auto-generated method stub
            return 0;
        }
        @Override public Iterator<Card> iterator() {
            // TODO Auto-generated method stub
            return null;
        }
        private ArrayList<Card> cards;
    }
    

    迭代器很简单,因为数组列表有一个 . 寻找可比较的例子 . 你必须以某种方式初始化牌组 . 我在我的卡类中放了一个包含所有卡的静态最终数组 . 您可以使用数组作为列表从该数组中添加所有内容 .

  • 1

    首先,如果你的枚举有一个参数,你应该用一个参数声明一个构造函数:

    public enum Numerals {
        DEUCE(2), THREE(3), FOUR(4), FIVE(5), SIX(6), SEVEN(7), EIGHT(8), NINE(9), TEN(
                10), JACK(11), QUEEN(12), KING(13), ACE(14);
        private Numerals(int i) {
            this.value = i;
        }
    
        int value;
    }
    

    要创建yor套牌,您必须迭代您的套装和数字并为每对创建一张卡片:

    public Deck() {
        for (Suits s : Suits.values()) {
            for (Numerals n : Numerals.values()) {
                cards.add(new Card(s, n));
            }
        }
    }
    

    从compareTo javadoc:将此对象与指定的对象进行比较以获得顺序 . 返回负整数,零或正整数,因为此对象小于,等于或大于指定对象 .

    因此,您必须声明您的Card类的订单以实现compareTo(使用序数)

    public int compareTo(Card o) {
        if(this.suit.ordinal() == o.suit.ordinal()){
            return this.numeral.ordinal() - o.numeral.ordinal();
        }
        return this.suit.ordinal() - o.suit.ordinal();
    }
    

    希望能帮助到你 .

    PS:小心覆盖equals方法take a look here

相关问题