java - 对对象列表进行排序

标签 java list enums

我正在制作一个模拟纸牌游戏的程序。我有一个类 Card 代表一张扑克牌:

//suit types
public enum Suits{
    SPADES,
    CLUBS,
    HEARTS,
    DIAMONDS
}

//value types
public enum Values{
    TWO,
    THREE,
    FOUR,
    FIVE,
    SIX,
    SEVEN,
    EIGHT,
    NINE,
    TEN,
    JACK,
    QUEEN,
    KING,
    ACE, 
}

private Suits suit;
private Values value;

//Card constructor
public Card(Values value, Suits suit){
    this.value = value;
    this.suit = suit;
}

在我的游戏类中,我有一个玩家手牌,由 CardsList 表示:

public List<Card> playerHand = new ArrayList<Card>();

有没有一种方法可以根据我的枚举对玩家手牌进行排序?如果玩家的手牌是:

十,王牌,二,五

订购后将是:

二、五、十、ACE

我的条件是Ace总是很高,而Suit并不重要。我知道排序列表很简单,我只是不知道如何为基于 enum

Object 执行此操作

最佳答案

枚举具有默认顺序,即它们实现 Comparable因此,您可以对枚举列表进行排序或调用 ACE.compareTo( TEN )在一些Comparator 。请注意,枚举值的顺序是枚举类中定义的顺序(基于序数,请参阅下一段),即在您的情况下 TWO <THREE <FOUR等等

此外,枚举还有一个序数,即定义中枚举值的索引。在你的情况下TWO将会有序数 0, THREE序数 1 等

为了对卡片进行排序,您可以使用 Comparator (或实现 Comparable<Card> ),如下所示:

class CardComparator implements Comparator<Card> {
  public int compare( Card lhs, Card rhs) {
    //suit would be relevant otherwise you'd end up with spades 10, hearts 10, spades jack etc.
    //thus sort by suit first to keep the cards of a suit together
    int r = lhs.suit.compareTo( rhs.suit ); 

    if( r == 0) { //same suit    
      r = lhs.value.compareTo( rhs.value );
    }
    return r;
  } 
}

关于java - 对对象列表进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23136226/

相关文章:

java - Tomcat ssl 端口未自动重定向

python - 将字典中的值转换为矩阵

Python:查找列表对的一个成员中的连续变化,报告其他成员

swift - 什么决定了协议(protocol)一致性的优先级?

java - 为什么 myEnum.ONE 不等于 myEnum.ONE.toString()?

c++ - 如何显示类中某些内容的枚举值?

java - 如何在 JTabbedPane 中删除 "tab borders"

java - YouTube 视频下载(Android/Java)

java - 如何减慢行星在轨道上的移动速度?

python - 列表列表更改意外地反射(reflect)在子列表中