1

したがって、オブジェクトをディスプレイに追加するこのメソッドがあります。ディスプレイが最初に開かれると、既存のすべてのオブジェクトが 1 つずつ HashMap に追加されます。その後、ユーザーは一度に 1 つずつさらに追加して、新しいオブジェクトを HashMap に入れることができます。

Key は Object で、Value は Object とそれに関する他のいくつかの変数を含むカスタム クラスです。

これはすべて正常に動作しますが、ディスプレイが閉じられて新しいインスタンスが開かれると、すべてのオブジェクト (使用中にユーザーによって作成および保存されたものを含む) が再ロードされるはずですが、何らかの理由で新しく作成された1 つは、containsKey を実行するときに不正確な一致を検出します。

一致するはずがないのになぜ一致を見つけるのか、私にはよくわかりません。containsValue を実行すると、誤った一致は見つかりません (正常に動作します) が、HashMap.put(K, V) を使用すると、containsKey の誤検出を返したものをオーバーライドするため、役に立ちません。 .

コードが行うのは、各オブジェクトを反復処理することだけです。HashMap に既にキーが含まれているかどうかを確認し、含まれている場合はキーの値を返します。そうでない場合は、メソッドに渡されたキーに基づいて値を作成し、それをハッシュマップに配置します。

申し訳ありませんが、コードを投稿することはできません。それがなければ助けられない場合は理解していますが、それは仕事のためであり、たとえそれが単なるスニペットであっても、コードを投稿してもよいかどうかわかりません.

ヘルプやガイダンスをいただければ幸いです。情報が見つかるかどうかを確認するために、まだ Google を検索しています。

編集:解決策を見つけました。ハッシュコード関数は、本質的にインデックスである値を返していました。問題は、最初のオブジェクトの後にリセットされたため、新しく追加されたオブジェクトがゼロから開始され、既存のオブジェクトが上書きされることでした。ハッシュコードとその動作を変更しました。

みんな助けてくれてありがとう。

4

2 に答える 2

5

クラスのメソッドではequalsなく、メソッドをオーバーライドしたようです。hashCode

custom classオブジェクトを のキーとして使用している場合はHashMap、クラスがequalshashCodeメソッドの両方をオーバーライドしていることを確認keyしてくださいHashMap

をオーバーライドしてもをオーバーライドequalsしない場合、メソッドに基づいて等しい可能性がありhashCodeますが、インスタンスに対して異なる hashCode を生成するクラス メソッドのメソッドから生成されます。keysequalshashCodehashCodeObject

一般に、メソッドをオーバーライドする必要がある場合both equals and hashCode、またはoverride none of them. また、 を計算するhashCodesには、メソッドで比較に使用した属性のみを使用する必要がありますequals

また、コメントの1つから、あなたKeysが不変であることを確認する必要があります。

于 2012-11-27T15:16:47.220 に答える
1

カスタム オブジェクトを HashMap のキーとして使用しないことをお勧めします。

これらのオブジェクトには何らかの識別情報がありますか? あるオブジェクトから別のオブジェクトに繰り返されない属性? HashMap のキーをこの属性に変更します。

このようにして、.containsKey()この属性をパラメーターとして渡すことができます。

于 2012-11-27T15:19:40.537 に答える