订购对象列表

时间:2014-04-17 14:40:16

标签: 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;
}

在我的游戏课程中,我有一个由List Cards代表的玩家手:

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

有没有办法可以通过我的枚举Values对玩家进行排序?意味着如果球员的手牌是:

TEN,ACE,TWO,FIVE

订购后会是:

TWO,FIVE,TEN,ACE

我的条件Ace总是很高,Suit并不重要。我知道排序列表是微不足道的我只是不知道如何根据Object

enum做这件事

4 个答案:

答案 0 :(得分:6)

枚举具有默认排序,即他们实施Comparable,因此您只需对枚举列表进行排序,或在某些ACE.compareTo( TEN )中调用Comparator。请注意,枚举值的顺序是枚举类中的定义顺序(基于序数,请参阅下一段),即在您的情况下TWO&lt; THREE&lt; 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;
  } 
}

答案 1 :(得分:1)

使用

Collections.sort(list, comparator);

进行排序。至于比较器:

new Comparator<Card>() {
  @Override
  public int compare(Card x, Card y) {
    return x.getValue().compareTo(y.getValue());
  }
}

答案 2 :(得分:1)

我会为SuitsValues中的每一个设置一个值,以便我可以将它们相互比较。例如:

public enum Suits{
    SPADES(1),
    CLUBS(2),
    HEARTS(3),
    DIAMONDS(4);

    private int value;

    private Suits(int value) {
        this.value = value;
    }

    public int getValue() {
        return value;
    }
}

Values枚举:

public enum Values{
    TWO(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 int value;

    private Values(int value) {
        this.value = value;
    }

    public int getValue() {
        return value;
    }
}

然后,您可以为Comparator

实施Cards
public class CardsComparator implements Comparator<Card> {
    public int compare(Card c1, Card c2) {
        //implementation based on the values of Suits and Values.
        if (c1.getSuits().getValue() == c2.getSuits.getValue()) {
            return c1.getValue().compareTo(c2.getValue());
        } else {
            return c1.getSuits().compareTo(c2.getSuits());
        }
    }
}

并应用比较器的实例来对List<Card>

进行排序
Collections.sort(listOfCards, new CardsComparator());

答案 3 :(得分:0)

您可以实现Comparable接口。您必须为您的Card类重新定义compareTo方法,然后它将允许您执行以下操作:

Card a = ...;
Card b = ...;

if(a.compareTo(b) <= 0) {
    ...
}

甚至:

Collections.sort(list);

请参阅http://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html