2012-05-19 8 views
5

Ich habe die folgende Enumeration, die einen CardRankVergleich Rang in einer Enum

public enum CardRank 
{ 
    DEUCE('2'), TREY('3'), FOUR('4'), FIVE('5'), SIX('6'), SEVEN('7'), 
    EIGHT('8'), NINE('9'), TEN('T'), JACK('J'), QUEEN('Q'), KING('K'), 
    ACE('A'); 

    private char symbol; 

    private CardRank(char symbol) 
    { 
     this.symbol = symbol; 
    } 

    public char getSymbol() 
    { 
     return this.symbol; 
    } 
} 

Die CardRank darstellt, ist in aufsteigender Reihenfolge dargestellt. Ich muss die Ränge vergleichen, um zu wissen, welcher Rang größer ist als der andere. Ich kann den Operator > mit den numerischen Werten verwenden, aber nicht mit den char-Werten.

// this will print out TRUE for all numerical values compared 
// but FALSE for the chars 
if (card.getRank().getSymbol() > anotherCard.getRank().getSymbol()) { 
    System.out.println("true"); 
} else { 
    System.out.println("false"); 
} 

Irgendwelche Ideen?

+1

hier einen Komparator verwenden. Sie können es zu einer statischen öffentlichen inneren Klasse machen, wenn Sie möchten. –

+0

möchten Sie vielleicht ein Low-Ass hinzufügen, wenn Sie mit Geraden beschäftigt sind. –

Antwort

14
if (card.getRank().compareTo(anotherCard.getRank()) > 0) 

ist, was Sie brauchen.

Sie können Alwo die Ordnungs verwenden:

if (card.getRank().ordinal() > anotherCard.getRank().ordinal()) 

Aufzählungen haben eine natürliche Ordnung durch ihre Ordnungs definiert. Und die Ordinalzahl eines Enums wird aufgrund seiner Position in der Deklaration zugewiesen. So hat DEUCE Ordinal 0, TREY Ordinal 1 usw.

+0

Ich würde Ordinalzahlen um jeden Preis vermeiden. Es wird als schlechte Form angesehen, eine Enum-Ordinalzahl in irgendeinem anderen als dem Framework-Typ-Code zu verwenden. [Ordinale Dokumentation] (http://docs.oracle.com/javase/7/docs/api/java/lang/Enum.html#ordinal%28%29), [Kann ich ordinal für enum (java) angeben] (http://stackoverflow.com/questions/5372855/can-i-specify-ordinal-for-enum-java) – Zixradoom

1

Erwägen, einen Komparator dafür zu verwenden. Es kann eine öffentliche statische innere Klasse sein, wenn Sie es wünschen:

import java.util.Comparator; 

public enum CardRank implements Comparable<CardRank> { 
    DEUCE('2'), TREY('3'), FOUR('4'), FIVE('5'), SIX('6'), SEVEN('7'), EIGHT('8'), NINE(
     '9'), TEN('T'), JACK('J'), QUEEN('Q'), KING('K'), ACE('A'); 

    private char symbol; 
    private static CardRankComparator cardRankComparator = new CardRankComparator(); 

    private CardRank(char symbol) { 
     this.symbol = symbol; 
    } 

    public char getSymbol() { 
     return this.symbol; 
    } 

    public int compareRank(CardRank otherCardRank) { 
     return cardRankComparator.compare(this, otherCardRank); 
    } 

    // public so that this can be used for sorting if need be 
    public static class CardRankComparator implements Comparator<CardRank> { 
     private static final String RANKS = "23456789TJQKA"; 

     @Override 
     public int compare(CardRank cr1, CardRank cr2) { 
     int rank1 = RANKS.indexOf(String.valueOf(cr1.getSymbol())); 
     int rank2 = RANKS.indexOf(String.valueOf(cr2.getSymbol())); 
     return rank1 - rank2; 
     } 
    } 
} 
+0

Diese Antwort ist zu kompliziert. 1. Wenn Sie einen String verwenden, um einen Auftrag zu definieren, müssen Sie jedes Mal, wenn Sie einen Vergleich durchführen, den String durchsuchen. 2. Enums sind von Design vergleichbar. – kamczak

0

Sitz in this link und in der @Hovercraft voller Aale ‚s Antwort, das ist, was ich schließlich tat (Arbeitsbeispiel: https://repl.it/EIZL/0):

import java.util.Arrays; 
import java.util.Comparator; 
import java.util.TreeSet; 

enum GoldSaints { 

    ARIES(1), 
    GEMINI(3), 
    LEO(5), 

    //oops, almost forgot about... 
    TAURUS(2), 
    CANCER(4), 
    VIRGO(6); 

    /* RANKING CAPABILITIES */ 

    private final int rank; 
    private static TreeSet<GoldSaints> rankedValues = new TreeSet<>(new GoldSaintsComparator()); 

    private GoldSaints(int rank) { 
     this.rank = rank; 
    } 

    private int getRank() { 
     return this.rank; 
    } 

    private static class GoldSaintsComparator implements Comparator<GoldSaints> { 
     @Override 
     public int compare(GoldSaints gs1, GoldSaints gs2) { 
      return gs1.getRank() - gs2.getRank(); 
     } 
    } 

    public static TreeSet rankedValues() { 
     if (rankedValues.isEmpty()) { 
      rankedValues.addAll(Arrays.asList(GoldSaints.values())); 
     } 

     return rankedValues; 
    } 

    public GoldSaints prev() { 
     return (GoldSaints) GoldSaints.rankedValues().lower(this); 
    } 

    public GoldSaints next() { 
     return (GoldSaints) GoldSaints.rankedValues().higher(this); 
    } 
} 

class Main { 

    public static void main(String[] args) { 

     TreeSet<GoldSaints> rankedValues = GoldSaints.rankedValues(); 

     for (GoldSaints gs : rankedValues) { 
      System.out.println(gs + " after " + gs.prev() + " and before " + gs.next()); 
     } 

     System.out.println("----------------------------------------"); 

     System.out.println(GoldSaints.ARIES.prev()); 
     System.out.println(GoldSaints.ARIES.next()); 
     System.out.println(GoldSaints.VIRGO.prev()); 
     System.out.println(GoldSaints.VIRGO.next()); 
    } 
} 

Und der Ausgang ist:

ARIES after null and before TAURUS 
TAURUS after ARIES and before GEMINI 
GEMINI after TAURUS and before CANCER 
CANCER after GEMINI and before LEO 
LEO after CANCER and before VIRGO 
VIRGO after LEO and before null 
---------------------------------------- 
null 
TAURUS 
LEO 
null 
+0

Eine weitere OO-Implementierung: https://repl.it/EIZL/4 – geedelur