9

私の質問は非常に単純だと思いますが、解決策が見つからなかったので、ここで質問することにしました。私が必要としているのHashMapは、次のようなカスタムキータイプでを作成することです。

HashMap<Pair<Integer, Integer>, StrategyPoint> myMap = new HashMap<Pair<Integer, Integer>, StrategyPoint> ();

HashMapただし、停止が適切に機能しなくなるため、ここで何かが欠落しています。まず、キーが一意でなくなり、同じ値を持つペアの別のインスタンスがで見つかりますkeySet。また、contains key関数は、私が想定しているようには機能しません:)。

私は明らかに何かが恋しいので、Pairクラスのインスタンスを比較する方法を何らかの方法で定義する必要があります。compareToただし、クラスにComparable withを実装しようとしましたが、Pairそれでも機能しません。助言がありますか?

私の元のコードはちょっと面倒で読みにくいので、ここで問題を説明するためだけに例を作成しました。

コードは次のとおりです。

HashMap<Pair<Integer, Integer>, StrategyPoint> myMap = new HashMap<Pair<Integer, Integer>, StrategyPoint> ();
    Pair<Integer, Integer> myPair = new Pair<Integer, Integer>(2,2);
    StrategyPoint myPoint= new StrategyPoint(2, 2, 5, 5, false);
    myMap.put(myPair, myPoint);


    Pair<Integer, Integer> searcher = new Pair<Integer, Integer> (0,0);
    searcher.setFirst(2);
    searcher.setSecond(2);
    System.out.println(myMap.containsKey(searcher));
    System.out.println(myMap.containsKey(myPair));

実行の結果は次のとおりです。

false

true

私はそれをデバッグし、サーチャーインスタンスは適切に入力されていますがHashMap、その中にそれを見つけることを拒否しているようkeySetです。

4

3 に答える 3

15

クラスに適切equalsに実装する必要があります。hashCodePair

HashMapこれらのメソッドを使用して、キー クラスを区別し、ハッシュします。

于 2013-02-23T09:56:36.967 に答える
7

equalsクラスでオーバーライドする必要がありますPair。このメソッドの実装は、 の 2 つのオブジェクトPairが等しいと見なされる方法を定義します。

そして、オーバーライドするときはいつでも、equals常にオーバーライドする必要がありますhashcode

equalsオーバーライドしてもオーバーライドしない場合に問題が発生する可能性があるhashcodeのは次のとおりです (Effective Java、Second Ed. から)。

2 つの異なるインスタンスは、クラスの equals メソッドによれば論理的に等しい場合がありますが、オブジェクトの hashCode メソッドにとっては、共通点がほとんどない 2 つのオブジェクトにすぎません。したがって、オブジェクトの hashCode メソッドは、コントラクトで要求される 2 つの等しい数値ではなく、一見乱数に見える 2 つの数値を返します。

論理的に等しい 2 つのインスタンスのハッシュコードは等しくないため、コレクション内に別のインスタンスを検索しようとすると、間違ったハッシュ バケットを検索してしまい、null.

の実装が従わなければならない一連の規則があります。をオーバーライドするための別のルールequalsセット。hashcode

于 2013-02-23T10:00:10.143 に答える
3

の Javadoc で指定されているコントラクトに従って、hashCode()Pairクラスを実装する必要があります。equals()Object

于 2013-02-23T09:56:50.867 に答える