2011-05-22 63 views
1

如何計算包含枚舉套裝和枚舉排名的卡片對象的散列碼?撲克遊戲中卡對象散列碼的建議?

+1

卡域(52)的空間小到足以放入一個'enum'它的自我。 – 2011-05-22 16:32:12

+0

@Jarrod:夠了,但老闆/老師的要求勝過了一切。 :) – 2011-05-22 16:37:34

+0

既然你是新人,我希望你指出 - 人們花時間回答問題,如果你考慮接受答案,這將是很好的。 – Premraj 2011-05-28 18:42:27

回答

3

如果你正在使用Eclipse,它可以爲你生成一個 「足夠好」 hashCode()實現:

context menu screenshot

public class Card 
{ 
    private Suit suit; 
    private Rank rank; 

    @Override 
    public int hashCode() 
    { 
     final int prime = 31; 
     int result = 1; 
     result = prime * result + ((rank == null) ? 0 : rank.hashCode()); 
     result = prime * result + ((suit == null) ? 0 : suit.hashCode()); 
     return result; 
    } 

    @Override 
    public boolean equals(Object obj) 
    { 
     if (this == obj) return true; 
     if (!(obj instanceof Card)) return false; 
     Card other = (Card) obj; 
     if (rank != other.rank) return false; 
     if (suit != other.suit) return false; 
     return true; 
    } 
} 

我只能想象的NetBeans,IntelliJ IDEA的,等等,都可以也這樣做。


這就是說,由於域名是小,這實現將同樣很好地工作(我想...):

public int hashCode() 
{ 
    int rankHash = ((rank == null) ? 0 : (1+rank.ordinal())); 
    int suitHash = ((suit == null) ? 0 : (1+suit.ordinal())); 
    return rankHash + 31*suitHash; 
} 

這是假定Rank序是0-12包容性和Suit序被0-3包括的。請注意,這裏的大多數醜陋都來自空檢查。如果值不能爲空,則:

public int hashCode() 
{ 
    return rank.ordinal() + 31*suit.ordinal(); 
} 
+0

刪除我的答案 - 因爲你的答案更徹底。 – 2011-05-22 16:27:44

3

如此小的值空間(它是13倍4?),將任意兩個卡分配相同的散列碼是沒有意義的。所以這完全取決於你,但是像這樣:

A spades = 1 
K spades = 2 
.... 
A clubs = 21 
K clubs = 22 
.... 

應該沒問題。

一般是有意義的定義的哈希碼,如果有可能的值的真正龐大的數字(如每一個可能的String值或數字List<Number>的每一個可能的列表),並把他們限制在(投影到)哈希碼的空間有限值。如果我們正在討論如java.lang.Object API所定義的hashCode(),那麼'散列碼值的有限空間'必須適合int類型(整數)。

2

卡域(52)的空間,小到足以放入一個enum它的自我。這也會給你一個自然的識別主鍵,因爲hashCode也應該是對象內部狀態的唯一標識符。

下面是一些僞Java代碼來給你一個想法:

public enum Suit 
    HEART, CLUB, SPADE, DIAMOND 

public enum Rank 
    TWO, THREE, FOUR ... KING, QUEEN, ACE 

public enum Card 
    private final Suit suit; 
    private final Rank rank; 
    private Card(final Suit s, final Rank r); 

    ACE_HEARTS(ACE,HEART), TWO_HEARTS(TWO,HEART), ... KING_DIAMONDS(KING, DIAMOND); 

    public int hashCode() { return this.ordinal;) 
+1

這很簡單,至點(現在我只剩下2張選票 - 我討厭!)。 – 2011-05-22 16:45:49