0

所以我有一个实验室(我们被允许寻求外部帮助,所以我在这里经过了很多挠头)我们必须在其中实施一副纸牌。我们必须使用 enum 类来创建 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 张已排序的卡片(如您所见);但我们最终必须返回一个排序好的牌组。关于去哪里的任何建议?

4

3 回答 3

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

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

于 2014-02-04T02:03:09.190 回答
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;
}

要创建你的套牌,你必须迭代你的花色和你的数字,并为每一对创建一张卡片:

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

From 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方法看看here

于 2014-02-04T02:16:57.827 回答
1

要回答关于compareTo:如果小于a.compareTo(b)应该返回负数,如果大于则返回正数,如果它们相等则返回 0 的问题。此外,如果您要对对象进行排序,则排序应遵循的规则之一是 if , then 。(你不能同时拥有“小于”和“小于”)。Your ,只要卡不相等就会返回,不遵循此规则。要解决此问题,您需要决定排序。“分类牌组”是什么样的?大概所有的球杆都在一起,后面是所有的方块等等,这意味着任何一个ababa.compareTo(b) < 0b.compareTo(a) > 0abbacompareTo-1俱乐部卡将少于任何钻石卡。要正确执行此操作,您需要先比较花色,并且仅在花色相等时才比较等级:

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

compareToon each将enum返回<0, 0, 或>0。因此,您可以比较花色,返回一个值为<0or >0,然后在花色相等时比较排名。这是编写compareTo需要检查多条数据的任何方法的一般方法。

于 2014-02-04T02:09:15.670 回答