1

ハッシュマップから値を取得するときに問題が発生します。ハッシュマップは次のように宣言されています。

HashMap<TRpair,A> aTable = new HashMap<TRpair,A>();

次に、112個の値を次のようにマップに配置します。

aTable.put(new TRpair(new T(<value>),new Integer(<value>)),new Ai());

ここで、AiはAを拡張する4つのサブクラスのいずれかです。

次に、次のように、マップにどのような値があるかを確認します。

int i = 0;
for (Map.Entry<TRpair,A> entry : aTable.entrySet()) {
    System.out.println(entry.getKey().toString() + " " + entry.getValue().toString());
    System.out.println(entry.getKey().equals(new TRpair(new T("!"),new Integer(10))));
    i++;
}

iは、予想どおり、最後に値112を保持し、同等性テストは、予想どおり、正確に1つのエントリに対してtrueを出力します。

しかし、私がするとき

System.out.println(aTable.get(new TRpair(new T("!"), new Integer(10))));

nullが出力されますが、上記のコードスニペットは、マップにこのキーを持つエントリが実際に1つあることを確認しています。

それが役立つ場合、クラスTRpairは次のように宣言されます。

public class TRpair {
    private final T t;
    private final Integer r;

    protected TRpair(Integer r1, T t1) {
        terminal = t1;
        row = r1;
    }

    protected TRpair(T t1, Integer r1) {
        t = t1;
        r = r1;
    }

    @Override
    public boolean equals(Object o) {
        TRpair p = (TRpair)o;
        return (p.t.equals(t)) && (p.r.equals(r));
    }

    @Override
    public String toString() {
        StringBuilder sbldr = new StringBuilder();
        sbldr.append("(");
        sbldr.append(t.toString());
        sbldr.append(",");
        sbldr.append(r.toString());
        sbldr.append(")");
        return sbldr.toString();
    }
}

各Ai(拡張A)およびTクラスのequals()メソッドとtoString()メソッドは同様にオーバーライドされ、期待どおりに動作するように見えます。

対応するキーの値が実際にマップにあることが以前に確認されているのに、ハッシュマップaTableから出力される値がnullになるのはなぜですか?

感謝の気持ちを込めて、

フロスコイ。

4

2 に答える 2

3

Hashコレクションのキー/要素。ただし、euqalsがオーバーライドされる場合はhashCode()をオーバーライドします。

使用できます。

public int hashCode() {
    return t.hashCode() * 31 ^ r.hashCode();
}

ところで:あなたのコードからはそうでInteger rはないようnullに見えますが、その場合は使用int rする方が理にかなっています。

Object.equals()から

通常、hashCodeメソッドの一般的なコントラクトを維持するために、このメソッドがオーバーライドされるたびにhashCodeメソッドをオーバーライドする必要があることに注意してください。これは、等しいオブジェクトには等しいハッシュコードが必要であると述べています。

于 2012-09-17T12:13:42.630 に答える
1

IIRCハッシュマップはhashCode()等式ではなく検索します。ハッシュコードを実装しなかったため、オブジェクトポインタの等式と一致するデフォルトの実装を使用します。整数(またはいいえ)

hashCode()とequals()は一貫していることをお勧めしますが、何をしているのかを知っている場合は構造的に必要ではありません。

于 2012-09-17T12:16:39.167 に答える