2016-04-15 3 views
0

Ich muss Vergleichsklassen zu einer Klasse hinzufügen, die eine Karte in Java darstellt. Ein Komparator (compareAscending) sortiert die Karten in aufsteigender Reihenfolge, sortiert zuerst nach Farbe und dann nach Rang (d. H. Reihenfolge Pik, Herz, Karo, Kreuz, dann nach Wert). Der zweite Komparator (compareRank) sortiert in aufsteigender Rangfolge, d. H. Zuerst alle zwei, dann alle drei. .Einfügen von Vergleichsklassen in einer Java-Klasse

Anzug und Rang sind beide Aufzählungen und der Code für sie unter

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)]; 
    } 
} 

Ive ist nie zuvor Komparator Klassen verwendet, so wurde gefragt, ob jemand erklären könnte, wie ich zum Einfügen von ihnen gehen? Sind sie dasselbe wie die Klasse vergleichbar zu machen (was es ist)?

Vielen Dank im Voraus.

+0

Sie könnten mit diesen Vergleichsmethoden eine Card-Klasse erstellen. Verwenden Sie einfach '.ordinal()', um die Position der Enumeration im Enumerationsfeld zu ermitteln und sie so zu vergleichen. – vedi0boy

+0

Sie fragen nach einem Tutorial. Warum * speziell * können Sie den Code nicht selbst schreiben? – Raedwald

+0

Sie müssen sie nicht "einfügen", sondern nur zwei "Comparator" -Implementierungen durchführen und eine Instanz dieses Komparators an die Sortierfunktion übergeben, die sie verwenden soll. – Krease

Antwort

4

A Comparator<Card> ist mehr oder weniger die gleichen wie die Umsetzung Comparable<Card>:

a.compareTo(b) 

wird

comparator.compare(a, b); 

Sie auch einer der Komparatoren verwenden, können Sie für Ihre compareTo Methode definieren zu vermeiden Code zu duplizieren:

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); 
    } 
} 

Dann können Sie wie folgt verwenden:

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

Sie auch andere gemeinsame Komparatoren, wie diejenigen hinzufügen, die Asse als niedrige Karten anstelle von hohen Karten in Betracht ziehen. Spiele können auch ihre eigenen spielspezifischen Komparatoren implementieren, aber diese würden nicht in Ihre Card Klasse gehen.