用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); }
每个enum
的compareTo
将返回<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方法看看这里
- 在Windows上设置Java R接口(JRI)
- Hibernate没有在Spring Boot Project中抛出LazyInitializationException
- WSDL中的参数名称具有重要名称
- JPA EntityManager的合并方法会导致OptimisticLockException吗?
- java.lang.ClassNotFoundException:org.springframework.boot.SpringApplication Maven
- 在Java中,如果返回类型分别是基元及其包装类,是否可以重写方法?
- scala和java枚举之间的差异
- 为什么我收到IllegalMonitorStateException?
- Url模式,用于排除servletfilter调用的javax.faces.resource