Java - не работает ли Set.contains () в OpenJDK 6? - PullRequest
4 голосов
/ 03 июня 2010

Я столкнулся с действительно странной проблемой. Я написал простой класс 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 на моем классе карт правильная и, как вы можете видеть из вывода, он работает!

Что здесь происходит?

Приветствия

Пит

Ответы [ 4 ]

11 голосов
/ 03 июня 2010

Вы забыли реализовать hashCode () способом, соответствующим equals () :) (Т.е. равные объекты должны возвращать один и тот же хэш-код).

8 голосов
/ 03 июня 2010

Java - не работает ли Set.contains () в OpenJDK 6?

Нет, это не так.

Первое правило отладки Java состоит в том, что в 99,9% случаев ваш код нарушается, а не стандартные библиотеки Java.

3 голосов
/ 03 июня 2010

А как насчет hashCode? Вы должны всегда переопределять их вместе, в соответствии с «Эффективной Явой» Джошуа Блоха глава 3 .

Разместите свой класс карты. Тогда это будет легко заметить.

2 голосов
/ 03 июня 2010

Пожалуйста, отправьте код для класса Deck - по крайней мере, методы equals(Object) и hashCode().

Мое первое предположение, что вы реализовали только equals(), но не hashCode().Если это так, прочитайте документацию класса java.lang.Object.

...