【问题标题】:Implementing a Deck of Cards in Java用 Java 实现一副纸牌
【发布时间】:2014-02-27 18:29:48
【问题描述】:

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

【问题讨论】:

  • Deck 构造函数循环通过cards 没有意义,因为Deck 构造函数应该创建 cards。您可能想要一个穿过套装和等级的双重for 循环(您称之为Numerals)。如果你不知道如何设置ArrayList,javadoc 是here

标签: java iterator comparator cloneable


【解决方案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

【讨论】:

  • 很抱歉这么晚才回复您。这是有道理的。我现在处于 Java 的第二个序列中,并且向我们抛出了很多序列 1 中未涵盖的内容。
【解决方案2】:

要回答有关compareTo 的问题:如果a 小于ba.compareTo(b) 应该返回负数,如果a 大于b 则返回正数,如果它们相等,则返回0。此外,如果您要对对象进行排序,则排序应遵循的规则之一是如果a.compareTo(b) &lt; 0,则b.compareTo(a) &gt; 0。 (您不能同时拥有“a 小于 b”和“b 小于 a”)。您的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);
}

每个enum 上的compareTo 将返回&lt;00&gt;0。因此,您可以比较花色,返回一个值 &lt;0&gt;0,然后比较花色是否相等的等级。这是编写任何需要检查多条数据的compareTo 方法的一般方法。

【讨论】:

    【解决方案3】:

    如果你使用像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;
    }
    

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

    【讨论】:

    • 所以我的迭代器是: public Iterator iterator() { return cards.iterator();我利用了 ArrayList 已经拥有的迭代器。对不起,如果我在这里的格式很奇怪,我是这个论坛的新手,可能会在做正确的事情时绊倒......
    猜你喜欢
    • 2011-07-12
    • 2012-06-07
    • 1970-01-01
    • 1970-01-01
    • 2023-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-30
    相关资源
    最近更新 更多