2012-05-19 4 views
5

я следующее перечисление, которое представляет собой CardRankСравнивая ранг в перечислении

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

В CardRank представлена ​​в порядке возрастания. Мне нужно сравнить ряды, чтобы узнать, какой ранг больше, чем другой. Я могу использовать оператор > с числовыми значениями, но не с значениями char.

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

Любые идеи?

+1

Используйте компаратор здесь. Вы можете сделать это статическим публичным внутренним классом для перечисления, если хотите. –

+0

вы можете добавить к нему низкий туз, если вы заинтересованы в прямых. –

ответ

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

- вот что вам нужно.

Вы можете alwo использовать порядковый номер:

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

Перечни имеют естественный порядок, определяемый их порядкового. И порядковый номер перечисления присваивается на основе его позиции в декларации. Таким образом, DEUCE имеет порядковый номер 0, TREY имеет порядковый номер 1 и т. Д.

+0

Я бы избегал ординалов любой ценой. Считается, что плохая форма использует порядковый номер enum в любом другом коде кода фреймворка. [Исходная документация] (http://docs.oracle.com/javase/7/docs/api/java/lang/Enum.html#ordinal%28%29), [Можно указать порядковый номер для перечисления (java)] (http://stackoverflow.com/questions/5372855/can-i-specify-ordinal-for-enum-java) – Zixradoom

1

Рассмотрите возможность использования компаратора для этого. Это может быть общественный статический внутренний класс, если вы хотите:

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

Этот ответ слишком сложный. 1. Использование String для определения порядка означает каждый раз, когда вы вызываете сравнение, вам нужно сканировать строку. 2. Перечисления по проектам сопоставимы. – kamczak

0

Основанная в this link и в @Hovercraft Полный ответа Угри «s, это то, что я наконец-то сделал (рабочий пример: 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()); 
    } 
} 

И выход:

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

Дополнительная реализация OO: https://repl.it/EIZL/4 – geedelur