用Java实现卡片组

所以我有一个实验室(我们被允许寻求外界的帮助,所以我在这里经过多次努力)我们必须实施一副卡片。 我们必须使用枚举类来创建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, Comparator { private ArrayList cards; public Deck (){ for (Card c : cards){ } } 

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

要回答有关compareTo的问题: a.compareTo(b)如果a小于b则返回负数,如果a大于b则返回正数,如果a相等则返回0。 此外,如果您要订购对象,则排序应遵循的规则之一是,如果a.compareTo(b) < 0 ,则b.compareTo(a) > 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); } 

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

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

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

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

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

 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方法看看这里