2010-06-03 60 views
4

我遇到了一個非常奇怪的問題。我已經寫了一個簡單的Deck類,它代表了一個標準的52張牌撲克牌。這個職業有一個方法missingCards(),它返回從甲板上抽出的所有牌的集合。如果我嘗試使用.equals()來比較兩組相同的缺失卡,我會告訴他們它們是不同的,如果我檢查一組是否包含一個我知道使用.contains()的元素,我將返回falseJava - Set.contains()在OpenJDK 6上破解了嗎?

這裏是我的測試代碼:

public void testMissingCards() 
{ 
    Deck deck = new Deck(true); 
    Set<Card> drawnCards = new HashSet<Card>(); 
    drawnCards.add(deck.draw()); 
    drawnCards.add(deck.draw()); 
    drawnCards.add(deck.draw()); 
    Set<Card> missingCards = deck.missingCards(); 
    System.out.println(drawnCards); 
    System.out.println(missingCards); 
    Card c1 = null; 
    for (Card c : drawnCards){ 
     c1 = c; 
    } 
    System.out.println("C1 is "+c1); 
    for (Card c : missingCards){ 
     System.out.println("C is "+c); 
     System.out.println("Does c1.equal(c) "+c1.equals(c)); 
     System.out.println("Does c.equal(c1) "+c.equals(c1)); 
    } 
    System.out.println("Is c1 in missingCards "+missingCards.contains(c1)); 
    assertEquals("Deck confirm missing cards",drawnCards,missingCards); 
} 

(編輯:只是爲了清楚起見,我增加了兩個圈後,我發現測試失敗的第一個循環翻出從drawnCards卡,然後此卡檢查針對missingCards每卡 - 它總是一個相匹配,從而使卡必須包含在missingCards然而,missingCards.contains()失敗)

這裏是它的一個例子是輸出:

[5C, 2C, 2H] 
[2C, 5C, 2H] 
C1 is 2H 
C is 2C 
Does c1.equal(c) false 
Does c.equal(c1) false 
C is 5C 
Does c1.equal(c) false 
Does c.equal(c1) false 
C is 2H 
Does c1.equal(c) true 
Does c.equal(c1) true 
Is c1 in missingCards false 

我完全確信我的卡類上的.equals的實現是正確的,正如您從輸出中看到的那樣,它確實可行!

這是怎麼回事?

乾杯,

皮特

+0

這裏有一個花括號,所以你只需循環一次所有的卡片,然後只保留最後一個在c1中,並檢查一次。 – Karl 2010-06-03 03:30:35

+0

這是故意的,我非常困惑,所以我寫了一些非常粗糙和準備好的測試。 – Peter 2010-06-03 10:08:55

回答

11

你忘了執行中equals() :) (即相等的對象必須返回相同的散列碼)一致的方式hashCode()

+0

幾乎肯定是真的。海報應該確實發佈了Card.java。 – 2010-06-03 00:37:53

+0

感謝您的回答,我沒有實現hashCode()。你有關於如何最好地實現hashCode的任何提示(一張卡有一個字段的臉和適合哪個都是整數)? – Peter 2010-06-03 00:55:17

+0

Eclipse會自動生成一個合理的hashCode,並在1次點擊的同時等於。 – bwawok 2010-06-03 01:45:12

3

hashCode呢?根據Joshua Bloch的「Effective Java」chapter 3,您應該總是將兩者重疊在一起。

發佈您的卡片類。那麼很容易發現。

+0

爲什麼地球上這是低調?這與被接受的答案是一樣的。 – duffymo 2010-06-03 01:43:38

+0

+1吱吱作響的輪子得到了投票! – 2010-06-04 21:28:49

2

請發佈Deck類的代碼 - 至少有equals(Object)hashCode()方法。

我的第一個猜測是你只實施equals(),但不是hashCode()。如果是這種情況,請閱讀java.lang.Object課程的文檔。

8

Java-Set.contains()在OpenJDK 6上破解了嗎?

不,它不是。

調試Java的第一條規則是,99.9%的時間是你的代碼被破壞,而不是Java標準庫。

相關問題