2

主な質問
頂点オブジェクトで満たされたハッシュマップがあります。整数 (つまり 1) に基づいて、その頂点オブジェクトを見つけたいと思います。以下のコードを参照してください。

public class Playground {

    public static void main(String[] args) {
        Map<Vertex, String> map1 = new HashMap<Vertex, String>();
        Map<Integer, String> map2 = new HashMap<Integer, String>(); 

        Vertex v1 = new Vertex(5);
        map1.put(v1, "1");
        Vertex v2 = new Vertex(5);
        String s = map1.get(v2);
        System.out.println(s);

        Integer int1 = new Integer(1);
        map2.put(int1, "2");
        Integer int2 = new Integer(1);
        String t = map2.get(int2);
        System.out.println(t);
    }
}

class Vertex{

    public int id;

    public Vertex(int id){
        this.id = id;
    }

    @Override
    public boolean equals(Object obj) {
        Vertex v = (Vertex) obj;

        return (this.id == v.id);
    }
}

出力:
null
2

上記のように、Integer オブジェクトでは機能しますが、ユーザー定義の Vertex オブジェクトでは機能しません。equals メソッドもオーバーライドします。

追加情報 テキストファイルがあります。最初の列はエッジのテールを示します。2 番目のエッジの頭。以下は抜粋です:
1 1
1 2
1 8
1 4
2 47646
2 47647
...

頂点 1 ~ n をプリロードする理由は...そうです...頂点が既に存在するかどうかを確認するために毎回マップのキーセットをチェックできないからです。
とにかく、このテキスト ファイルに基づいて、ID "x" の頂点を見つけてエッジを追加する必要があります。

なぜ代わりに Integer オブジェクトをキーとして使用しないのかと疑問に思われるかもしれません。オンラインの多数の例で一般的な V オブジェクトが使用されており、それは理にかなっています --- 各ノード (irl) には、停留所の名前などの追加情報があります。

4

3 に答える 3

2

hashCodeメソッドをオーバーライドして、JVM がオブジェクトを HashMap に適切に格納および取得できるようにする必要があります。

HashMap などのハッシュされたコレクションで put メソッドが呼び出されると、オブジェクトを格納するバケットを決定するために、キー オブジェクトの hashcode メソッドが呼び出されます。次に、equals メソッドが呼び出されて、そこに何かが既に存在するかどうかが確認されます。

同様に、HashMap で get を実行すると、キー hashCode メソッドが呼び出されてバケットが検索され、オブジェクトが取得されます。

Vertex クラスで hashcode メソッドをオーバーライドしていないため、デフォルトの hashcode 実装が使用されます。したがって、同じ id 値を持つ 2 つの Vertex オブジェクトのハッシュコードが異なる可能性があります。

equals および hashcode メソッドをオーバーライドする方法については、次の関連記事をお読みください。

Java で equals と hashCode をオーバーライドする場合、どのような問題を考慮する必要がありますか?

同じトピックについて、Google でさまざまな記事を見つけることができます。良いグーグルの結果:

http://javarevisited.blogspot.in/2011/02/how-to-write-equals-method-in-java.html

于 2013-07-31T17:44:16.593 に答える
1

メソッドを追加して、クラスhashCode()で修正する必要がありますequals()Vertex

これを試して:

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Vertex vertex = (Vertex) o;

        if (id != vertex.id) return false;

        return true;
    }

    @Override
    public int hashCode() {
        return id;
    }
于 2013-07-31T17:47:07.283 に答える
0

hashCode()リクエストに一致するオブジェクトを判別するために使用されるマップ。クラスequals()で使用されます。Comparable指定されたプロパティが等しい場合でも、2 つのオブジェクトが同一であることは保証できません。

Integerオブジェクトで機能する理由は、Integerクラスが単純にプリミティブint型のラッパーであり、クラスの他のすべてのプロパティ/メソッドが別のオブジェクトIntegerと同一であるためです。Integer

于 2013-07-31T17:58:12.667 に答える