我正在制作一个模拟纸牌游戏的程序。我有一个代表扑克牌的班级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
做这件事
答案 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)
我会为Suits
和Values
中的每一个设置一个值,以便我可以将它们相互比较。例如:
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