[英]Implement comparable with 2 Enums
我正在创建一个模拟Hearts游戏的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
:Club-> Diamond-> Spade-> Heart进行排序,并且还按Value
对其进行排序,例如:Club(2- > Ace),钻石(2-> Ace)等
任何帮助将非常感激
枚举已经有一个compareTo 。 这取决于枚举常量的序数值。 按出现顺序将枚举赋予枚举。
但是,对于有心人和许多游戏来说,一张牌的价值取决于游戏的状态 。 所以,虽然你可以使用默认compareTo
的Values
比较相同颜色的卡,你还需要确定圈内卡的实际价值。 在心里使用颜色内的顺序没有意义。 您当然不应该在card类中创建compareTo
。
对于纸牌游戏,必须谨慎使用compareTo
,并且不应使其动态化。 如果顺序不是问题中的默认顺序,则不要使用该顺序。 请记住, compareTo
用于在具有自然顺序的一组元素内进行比较。 在许多纸牌游戏中,纸牌的价值随游戏而波动,因此没有这种自然顺序。
但是如果需要,您可以为每个回合创建一个新的Comparator
器,该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);
}
}
Java中的每个枚举常量都是一个关联的序数值。 可以通过在常量上调用ordinal()方法(例如SPADE.ordinal())来访问此值。
一旦所有枚举联系人按其值的升序排列,我们就可以使用序数执行您需要的那种比较。
枚举具有自然顺序,因此请按suit属性然后按值进行比较:
@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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.