私は本当に奇妙な問題に遭遇しました。Deck
私はトランプの標準的な52枚のカードデッキを表す簡単なクラスを書きました。このクラスにはmissingCards()
、デッキから引き出されたすべてのカードのセットを返すメソッドがあります。使用して欠落しているカードの2つの同一のセットを比較しようとすると.equals()
、それらは異なると言われ、セットに、使用していることがわかっている要素が含まれているかどうかを確認すると、.contains()
返されfalse
ます。
これが私のテストコードです:
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);
}
(編集:わかりやすくするために、テストの失敗に気付いた後、2つのループを追加しました。最初のループはdrawnCardsからカードを引き出し、このカードはmissingCardsのすべてのカードと照合されます。常に1つと一致するため、カードを含める必要があります。 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の実装が正しいことを完全に確信しており、出力からわかるように、それは機能します。
ここで何が起こっているのですか?
乾杯、
ピート