我遇到了一個非常奇怪的問題。我已經寫了一個簡單的Deck
類,它代表了一個標準的52張牌撲克牌。這個職業有一個方法missingCards()
,它返回從甲板上抽出的所有牌的集合。如果我嘗試使用.equals()
來比較兩組相同的缺失卡,我會告訴他們它們是不同的,如果我檢查一組是否包含一個我知道使用.contains()
的元素,我將返回false
。Java - 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的實現是正確的,正如您從輸出中看到的那樣,它確實可行!
這是怎麼回事?
乾杯,
皮特
這裏有一個花括號,所以你只需循環一次所有的卡片,然後只保留最後一個在c1中,並檢查一次。 – Karl 2010-06-03 03:30:35
這是故意的,我非常困惑,所以我寫了一些非常粗糙和準備好的測試。 – Peter 2010-06-03 10:08:55