4

私は本当に奇妙な問題に遭遇しました。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の実装が正しいことを完全に確信しており、出力からわかるように、それは機能します。

ここで何が起こっているのですか?

乾杯、

ピート

4

4 に答える 4

11

equals() :)と一貫性のある方法でhashCode()を実装するのを忘れました(つまり、等しいオブジェクトは同じハッシュコードを返す必要があります)。

于 2010-06-03T00:37:02.133 に答える
8

Java-OpenJDK 6でSet.contains()が壊れていますか?

いいえそうではありません。

Javaをデバッグする最初のルールは、99.9%の確率でコードが壊れており、Java標準ライブラリではないということです

于 2010-06-03T03:24:53.597 に答える
3

hashCodeはどうですか?Joshua Blochの「EffectiveJava」の第3章によると、常に2つを一緒にオーバーライドする必要があります。

カードクラスを投稿します。そうすれば簡単に見つけることができます。

于 2010-06-03T00:37:47.953 に答える
2

クラスのコードを投稿してくださいDeck-少なくともequals(Object)hashCode()メソッド。

私の最初の推測は、あなたは実装しただけで、実装equals()しなかったということですhashCode()。その場合は、java.lang.Objectクラスのドキュメントをお読みください。

于 2010-06-03T00:38:08.190 に答える