2016-04-15 21 views
0

我需要將比較器類添加到我用Java代表Card的類中。一個比較(compareAscending)將牌按升序排序,首先按套裝排序,然後排序(即適合黑桃,紅桃,鑽石,俱樂部,然後按價值排序)。第二個比較器(compareRank)按照排名的升序排列,即所有的兩個都是第一個,然後是所有的三個。 。在Java類中插入Comparator類

西裝和等級都枚舉和代碼對他們來說是低於

enum Rank { 

    TWO(2), THREE(3), FOUR(4), FIVE(5), SIX(6), SEVEN(7), EIGHT(8), 
    NINE(9), TEN(10), JACK(10), QUEEN(10), KING(10), ACE(11); 

    private int value; 

    Rank(int i) { 
     value = i; 
    } 

    public int getValue() { 
     return value; 
    } 

    public Rank getPrevious() { 
     return values()[ordinal() > 0 ? ordinal() - 1 : 0]; 
    } 

} 

enum Suit { 

    CLUBS, DIAMONDS, HEARTS, SPADES; 

    public static Suit randomSuit() { 
     Random random = new Random(); 
     return values()[random.nextInt(values().length)]; 
    } 
} 

香港專業教育學院從未使用過比較類,所以想知道如果有人可以解釋我如何去插入呢?他們是否與讓班級具有可比性(是)相同?

在此先感謝。

+0

你可以用這些比較方法創建一個Card類。只需使用'.ordinal()'獲取枚舉數組中的枚舉位置並像這樣比較它們即可。 – vedi0boy

+0

你正在問一個教程。爲什麼*特別*你不能自己寫代碼? – Raedwald

+0

您不需要「插入」它們,只需製作兩個「比較器」實現,然後將該比較器的實例傳遞給排序函數以供其使用。 – Krease

回答

4

一個Comparator<Card>或多或少一樣實現Comparable<Card>

a.compareTo(b) 

成爲

comparator.compare(a, b); 

你甚至可以使用您爲您的compareTo方法,以避免重複碼比較之一:

public class Card implements Comparable<Card> { 
    public static final Comparator<Card> COMPARE_ASCENDING = (a, b) -> { /* compare here */ }; 
    public static final Comparator<Card> COMPARE_DESCENDING = (a, b) -> { /* compare here */ }; 

    @Override 
    public int compareTo(Card other) { 
     // Ascending is the "default" sort: 
     return COMPARE_ASCENDING.compare(this, other); 
    } 
} 

然後你可以使用這樣的:

List<Card> cards = ...; 
Collections.sort(cards); // #1 
Collections.sort(cards, Card.COMPARE_ASCENDING); // #2, same as #1 
Collections.sort(cards, Card.COMPARE_DESCENDING); // #3 

您還可以添加其他常見的比較,如考慮王牌低卡的,而不是高牌的。遊戲也可以實現他們自己的遊戲特定的比較器,但那些不會在你的Card類。