Я столкнулся с действительно странной проблемой. Я написал простой класс Deck
, представляющий стандартную колоду из 52 карт игральных карт. У класса есть метод missingCards()
, который возвращает набор всех карт, которые были извлечены из колоды. Если я попытаюсь сравнить два идентичных набора отсутствующих карточек, используя .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);
}
(Edit: просто для ясности я добавил два цикла после того, как я заметил, что тест не пройден. Первый цикл извлекает карту из вытянутых карт, а затем эта карта проверяется на каждую карту в отсутствующих картах - она всегда совпадает с одной, так что эта карта должен содержаться в отсутствующих карточках. Однако, отсутствует карточка отсутствующих карточек.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 на моем классе карт правильная и, как вы можете видеть из вывода, он работает!
Что здесь происходит?
Приветствия
Пит