現在マップエディターでTDゲームを行っています。今や明らかに、これらのマップを保存して読み込むことができます(または少なくともできるはずです)。 問題:ある時点でHashMap
に.get()
と呼んでいます。残念ながら、私の以前のGoogleの調査によると、.equals
メソッドをオーバーライドするだけでは、まだ異なるハッシュが返されるため、(論理的に)同じである必要があるキーは同じオブジェクトではありません(参照の点で)。 .hashCode()
(私が確認したところ、別のハッシュを返しますが、.equals
はtrueを返します)。
"hashCode()"のおかげで、HashMap.get()が適切な値を返しません。
は具体的には、HashMap
をキーとして私のクラスPath
のインスタンスが含まれており、返す必要があります(HashMap.get(key)
のjavadocが唯一、彼らが同じでなければならないと述べているので、サイドノートでは、それは、かなり混乱します)対応する敵のリスト(=値)。
(などゲッターなし)Path
の短いバージョン:
public class Path
{
private List<Tile> tiles = new ArrayList<>();
@Override
public boolean equals(Object obj) {
//code comparing the two paths
}
@Override
public int hashCode() {
//what I still need to implement. ATM, it returns super.hashCode()
}
}
public class Tile
{
private int x;
private int y;
//constructor
//overrides equals
//getters & some convenience methods
}
2つのパスが等しい場合HashMap
は正しいリストを返すように、今、私は、彼らが同じハッシュコードを返したいのですが敵。 (2つの同一のパスを追加することはできません)。
は今、私の質問:
はあなたが私はハッシュを計算する私の独自の実装を記述するハッシュ
- を示唆してください。
?
HashMap
を他のタイプのマップに変更しないようにしてください。問題が解決される場合にも役立ちます。
generellの 'IDE'または' IDE'を使用して 'hashcode'を生成させる可能性があります – SomeJavaGuy
あなたはハッシュコードを好きなだけ単純または複雑にすることができます。これは、「これらの2つの曖昧なsimliar」チェックをすばやく実行することを意味します。ハッシュコードチェックで生き残ったものに対して、equalsメソッドに入る前にできるだけ多くの致命的に異なるマッチを削除します。だから、あなたのシステムによっては、 'return tiles.size()'が適切かもしれません!追加する価値がある –
:人々が間違っているのは、「ハッシュコード」を過度に複雑にすることです。それが実際の 'equals'メソッドと同じように複雑になるのであれば、それを持つことはできません。私は言ったように:それは "クイックチェック"の意味です。 –