用Java实现卡片组

时间:2014-02-04 01:40:46

标签: java iterator comparator cloneable

所以我有一个实验室(我们被允许寻求外界的帮助,所以我在这里经过多次努力)我们必须实施一副卡片。我们必须使用枚举类来创建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来实现&#34; hold&#34; 52个分类卡(如你所见);但我们必须最终返回一个已排序的牌组。关于去哪里的任何建议?

3 个答案:

答案 0 :(得分: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 :(得分:1)

要回答有关compareTo的问题:a.compareTo(b)如果a小于b则应返回否定值,如果a大于{{{},则为正值1}},如果它们相等则为0。此外,如果您要订购对象,则排序应遵循的规则之一是b,然后是a.compareTo(b) < 0。 (您不能同时“b.compareTo(a) > 0小于a”且“b小于b”。只有在卡片不相同时才会返回a的{​​{1}}不符合此规则。要解决这个问题,您需要决定订购。 “排序甲板”是什么样的?可能所有的俱乐部都在一起,其次是所有的钻石等,这意味着任何俱乐部卡将少于任何钻石卡。要正确地做到这一点,你需要首先比较套装,并且只有在套装相同时才需要比较:

compareTo

每个-1上的public int compareTo (Card aCard){ int suitCompare = this.aSuit.compareTo(aCard.aSuit); if (suitCompare != 0) { return suitCompare; } return this.aNumeral.compareTo(aCard.aNumeral); } 将返回compareToenum<0。因此,您可以比较套装,返回0>0的值,然后比较套装是否相等。这是编写需要检查多个数据的任何<0方法的一般方法。

答案 2 :(得分: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));
        }
    }
}

来自 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