我正在创建一个模拟一场Heart游戏的Java
程序。我有另一个卡片游戏模拟的Card
课程:
public abstract class Card implements Comparable<Card>{
public enum Suits {
SPADES,
CLUBS,
HEARTS,
DIAMONDS
}
public enum Values {
TWO,
THREE,
FOUR,
FIVE,
SIX,
SEVEN,
EIGHT,
NINE,
TEN,
JACK,
QUEEN,
KING,
ACE,
}
private Suits suit;
private Values value;
public Card(final Values value, final Suits suit) {
this.value = value;
this.suit = suit;
}
public Values getValue() {
return value;
}
public Suits getSuit() {
return suit;
}
public void showCard() {
value = getValue();
suit = getSuit();
System.out.println(value + " of " + suit);
}
private int compareTo(final Card comparedToCard) {
//code here
}
}
我需要一些实施compareTo
方法的帮助。我有使用此方法的经验,以及它应如何根据您想要比较对象的方式返回1,0或-1。但是,我以前从未使用enums
实现它。我知道Enum
类实现了可比性,但即使在查看API文档后,我也不知道如何比较两个枚举。
我希望的结果是对ArrayList<Card>
进行排序,使其首先按Suit
排序:俱乐部 - &gt;钻石 - &gt; Spade - &gt;心脏,并且也按Value
排序,所以:俱乐部(2&gt; Ace),钻石(2&gt; Ace)等...
非常感谢任何帮助
答案 0 :(得分:2)
Enum已经有compareTo。这个取决于枚举常数的序数值。顺序按照外观顺序给予枚举。
对于心灵和许多游戏而言,牌的价值取决于游戏的状态。因此,虽然您可以使用compareTo
的默认Values
来比较相同颜色的卡片,但仍需要确定转弯中卡的实际值。在心中使用颜色中的顺序是没有意义的。 您当然不应在卡片类中创建compareTo
。
对于纸牌游戏,compareTo
应谨慎使用,不应动态。如果订单不是您问题中的默认订单,那么根本不要使用它。请记住,compareTo
用于在一组带有自然顺序的元素中进行比较。在许多纸牌游戏中,牌的价值随着游戏而波动,所以没有这样的自然秩序。
如果必须,你可以为每个转弯创建一个新的Comparator
,这个只是赞成任何与第一张牌相同的套牌。由于第一张卡片应始终位于已检查的卡片列表中,因此单张纸牌应该总是有赢家。
public class TurnComparator implements Comparator<Card> {
private final Suits firstCardSuite;
TurnComparator(Suits firstCardSuite) {
this.firstCardSuite = firstCardSuite;
}
@Override
public int compare(Card o1, Card o2) {
if (o1.suit != firstCardSuite && o2.suit != firstCardSuite) {
return 0;
}
if (o1.suit != firstCardSuite && o2.suit == firstCardSuite) {
return -1;
}
if (o1.suit == firstCardSuite && o2.suit != firstCardSuite) {
return 1;
}
return o1.value.compareTo(o2.value);
}
}
答案 1 :(得分:1)
Java中的每个枚举常量作为关联的序数值。可以通过在常量上调用ordinal()方法来访问此值,例如SPADE.ordinal()。
一旦所有枚举联系人按其值的升序排列,我们可以使用序数来执行您需要的那种比较。
答案 2 :(得分:0)
枚举具有自然顺序,因此请根据套装属性进行比较,然后按值进行比较:
@Override
public int compareTo(Card o)
{
return Comparator.comparing(Card::getSuit)
.thenComparing(Card::getValue)
.compare(this, o);
}
或者如果你想要一个比较器:
Comparator<Card> comp = Comparator.comparing(Card::getSuit)
.thenComparing(Card::getValue);