如何計算包含枚舉套裝和枚舉排名的卡片對象的散列碼?撲克遊戲中卡對象散列碼的建議?
回答
如果你正在使用Eclipse,它可以爲你生成一個 「足夠好」 hashCode()
實現:
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();
}
刪除我的答案 - 因爲你的答案更徹底。 – 2011-05-22 16:27:44
如此小的值空間(它是13倍4?),將任意兩個卡分配相同的散列碼是沒有意義的。所以這完全取決於你,但是像這樣:
A spades = 1
K spades = 2
....
A clubs = 21
K clubs = 22
....
應該沒問題。
一般是有意義的定義的哈希碼,如果有可能的值的真正龐大的數字(如每一個可能的String
值或數字List<Number>
的每一個可能的列表),並把他們限制在(投影到)哈希碼的空間有限值。如果我們正在討論如java.lang.Object
API所定義的hashCode()
,那麼'散列碼值的有限空間'必須適合int
類型(整數)。
卡域(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;)
這很簡單,至點(現在我只剩下2張選票 - 我討厭!)。 – 2011-05-22 16:45:49
- 1. 撲克遊戲決定卡
- 2. 建議Zynga撲克等多人遊戲的框架
- 3. Java在線撲克遊戲
- 4. 運行Java撲克遊戲
- 5. Java撲克遊戲程序
- 6. 蘋果遊戲中心的撲克桌
- 7. java的撲克遊戲空指針
- 8. 實現撲克遊戲的投注
- 9. 設計撲克遊戲的結構
- 10. 比較ArrayList撲克遊戲Java
- 11. 直接在java撲克遊戲
- 12. VBScript撲克遊戲 - 我有什麼牌?
- 13. 撲克遊戲,改變數組值
- 14. Rails + Heroku +多人遊戲(撲克)
- 15. java中的戰列艦遊戲建議
- 16. 創建頭部檢查器的Java撲克遊戲
- 17. 對齊遊戲中的卡陣列
- 18. Cocos2D遊戲教程/遊戲建議
- 19. 對單人紙牌遊戲的建議
- 20. 關於遊戲序列化的建議
- 21. 如何檢查我的撲克遊戲中的Full House?
- 22. 井字遊戲中的對象創建
- 23. Android Trading Card遊戲卡對象
- 24. Android遊戲UI建議
- 25. Android遊戲線程建議
- 26. 如何調試我的撲克遊戲遞歸邏輯?
- 27. 未處理的異常在撲克遊戲
- 28. 如何編寫RSpec來測試我的撲克遊戲丟棄?
- 29. 優化的算法[編譯準備代碼]從遊戲視角(撲克)
- 30. 遊戲協議
卡域(52)的空間小到足以放入一個'enum'它的自我。 – 2011-05-22 16:32:12
@Jarrod:夠了,但老闆/老師的要求勝過了一切。 :) – 2011-05-22 16:37:34
既然你是新人,我希望你指出 - 人們花時間回答問題,如果你考慮接受答案,這將是很好的。 – Premraj 2011-05-28 18:42:27