2012-11-07 48 views
1

我有这个类使用enum类型的套牌。 使这个类比较可以将卡按升序排序的最有效方法是什么? 如果它们是枚举类型,那么也可以在方法中比较两个卡片面值? (例如返回差异或什么?) 谢谢。Comparable Class Java

public class Card { 

public enum Rank {ACE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN, 
        JACK, QUEEN, KING} 
public enum Suit {CLUBS, DIAMONDS, HEARTS, SPADES} 

private final Rank rank; 
private final Suit suit; 

private Card(Rank rank, Suit suit) { 
    this.rank = rank; 
    this.suit = suit; 
} 

public int compareTo(Card c) { 
    Card aCard = (Card)c; 
    int rankComparison = rank.compareTo(aCard.rank); 
    return rankComparison != 0 ? rankComparison : suit.compareTo(aCard.suit); 
} 

public Rank rank(){ 
    return rank; 
} 
public Suit suit(){ 
    return suit; 
} 

public String toString(){ 
    return "The " + rank + " of " + suit + "."; 
} 
} 
+2

你似乎有一个完全合理的'compareTo'实施那里。唯一缺少的是在'public class Card'后添加'implements Comparable ''。 –

+0

我真的不明白你的问题,但你应该改变你的类声明为'public class Card implements Comparable ' – jlordo

+3

'只需添加'Card implements Comparable ',你的实现除了superflous'aCard'变量以外还可以。 –

回答

2
public int compareTo(Card c) { 
    int rankComparison = rank.compareTo(c.rank); 
    return rankComparison != 0 ? rankComparison : suit.compareTo(c.suit); 
} 

试试这个,只是使类实现Comparable接口。请注意,枚举按它们声明的顺序进行比较。

见, http://docs.oracle.com/javase/6/docs/api/java/lang/Enum.html#compareTo(E

为了测试这一点,你可以写不同的卡JUnit测试,例如,

@Test 
public void test() 
{ 
    Card aceOfSpades = new Card(Rank.ACE, Suit.SPADES); 
    Card fourOfClubs = new Card(Rank.FOUR, Suit.CLUBS); 

    assertTrue(aceOfSpades.compareTo(fourOfClubs) > 0)); 
} 
+2

只是FYI:通过成员给定的顺序,枚举是可比较的:http://stackoverflow.com/questions/8007108/java-sorting-based-on-enum-constants –

+0

好的,谢谢。什么是测试这个compareTo的最快方法? – binary101

+0

@shardy为你添加了一个测试:) –