2012-05-19 30 views
5

Tôi đã enum sau đó đại diện cho một CardRankSo sánh thứ hạng trong một 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; 
    } 
} 

Các CardRank được thể hiện theo thứ tự tăng dần. Tôi cần so sánh các cấp bậc để biết thứ hạng nào lớn hơn thứ hạng khác. Tôi có thể sử dụng toán tử > với các giá trị số nhưng không phải với các giá trị 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"); 
} 

Bất kỳ ý tưởng nào?

+1

Sử dụng một sánh ở đây. Bạn có thể biến nó thành lớp bên trong công cộng tĩnh thành enum nếu bạn muốn. –

+0

bạn có thể muốn thêm một ace thấp này nếu bạn quan tâm đến straights. –

Trả lời

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

là những gì bạn cần.

Bạn alwo có thể sử dụng thứ tự:

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

Enums có một trật tự tự nhiên được xác định bởi thứ tự của họ. Và thứ tự của một enum là do dựa trên vị trí của nó trong tuyên bố. Vì vậy, DEUCE có thứ tự 0, TREY có thứ tự 1, v.v.

+0

Tôi sẽ tránh các đơn vị ở tất cả các chi phí. Nó được coi là hình thức xấu để sử dụng một enum thứ tự trong bất cứ điều gì khác sau đó khuôn khổ loại mã. [Tài liệu thông thường] (http://docs.oracle.com/javase/7/docs/api/java/lang/Enum.html#ordinal%28%29), [Tôi có thể chỉ định thứ tự cho enum (java)] (http://stackoverflow.com/questions/5372855/can-i-specify-ordinal-for-enum-java) – Zixradoom

1

Cân nhắc sử dụng Bộ so sánh cho điều này. Nó có thể là một tĩnh lớp bên trong cộng đồng nếu bạn mong muốn:

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

Câu trả lời này quá phức tạp. 1. Sử dụng Chuỗi để xác định đơn hàng có nghĩa là mỗi khi bạn gọi so sánh, bạn cần phải quét qua chuỗi. 2. Enums được thiết kế tương đương. – kamczak

0

Có trụ sở tại this link và trong @Hovercraft Đầy đủ các câu trả lời Lươn 's, đây là những gì cuối cùng tôi đã làm (làm việc Ví dụ: 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()); 
    } 
} 

Và kết quả là:

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

Một triển khai OO khác: https://repl.it/EIZL/4 – geedelur

Các vấn đề liên quan