I ran into a really weird problem. I wrote a simple Deck class, which is a standard 52-card deck of playing cards. The class has a missingCards() method, which returns a set of all cards that were taken from the deck. If I try to compare two identical sets of missing maps using .equals() , they tell me that they are different, and if I check if there is a set containing the element that I know is used with .contains() , I return false .
Here is my test code:
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: just for the sake of clarity, I added two loops after I noticed that the test failed. The first cycle pulled out a card from drawCards, and then this card is checked for each card in missingCards - it always matches one, so the card should contained in missingCards. However, missingCards.contains () does not work)
And here is an example of its output:
[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
I am completely sure that the .equals implementation on my map class is correct and, as you can see from the output, it works!
What's going on here?
Greetings
Pete
source share