3

たとえば、HashSet<E>にオブジェクトを追加した場合、オブジェクトが既に存在するかどうかをどのように確認しますか?

次の簡単な設定があります。

private class MyObject {
    String text;

    public MyObject(String text) {
        this.text = text;
    }

    @Override
    public boolean equals(Object o) {
        if (o != null && o instanceof MyObject) {
            return ((MyObject) o).text.equals(text);
        }

        return false;
    }

}

私のプロジェクトには、このような多くのオブジェクトがありますが、すべて個別に初期化されています。次のように、すべてを a に追加して、double をフィルター処理したいと思いますSet

MyObject m1 = new MyObject("1");
MyObject m2 = new MyObject("1");
MyObject m3 = new MyObject("2");

System.out.println(m1.equals(m2)); //expected: true, result: true
System.out.println(m1.equals(m3)); //expected: false, result: false

Set<MyObject> myObjects = new HashSet<MyObject>();
myObjects.add(m1);
myObjects.add(m2);
myObjects.add(m3);

System.out.println(myObjects.size()); //expected: 2, result: 3

Set<String> stringList = new HashSet<String>();
stringList.add("1");
stringList.add("1");
stringList.add("2");
System.out.println(stringList.size()); //expected: 2, result: 2

myObjectsセットにこれらの double が含まれないようにするにはどうすればよいですか? m1とは異なるインスタンスですが、内容は同じなのでm2、 だけが必要m1です。

編集
Mathias Schwarzの回答に基づいてhashCode()、次のように機能を実装しました。

@Override
        public int hashCode() {
            return text.hashCode();
        }

しかし、複数のフィールドを持つより複雑なクラスがある場合、このメソッドをどのように実装すればよいでしょうか?

4

4 に答える 4

7

HashSetequals呼び出しの結果とオブジェクトで 2 つのオブジェクトが同一であるかどうかを判断hashCodeします。hashCode実装する場合は実装する必要がありますequals。それらが矛盾している場合、HashSet正しく動作しません...したがって、重要なことは、これら2つのメソッドがどのように実装されているかですMyObject(ところで、実際にはクラスです...)。

于 2012-10-12T11:19:26.510 に答える
2

Eclipse を使用している場合は、右クリック --> ソース --> hashCode と Equals を生成します。ハッシュ コードと equals について詳しく知りたい場合は、 Effective Javaからこの部分をお読みください。

于 2012-10-12T12:07:03.707 に答える
1

私はマティアス・シュヴァルツに同意します。

詳細については、http: //docs.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html#hashCode () およびhttp://docs.oracle.com/javase/1.5 を参照してください。 0/docs/api/java/lang/Object.html#equals(java.lang.Object )

于 2012-10-12T11:22:57.267 に答える
0

クラス MyObject に以下を追加します

public String hashCode() {
  return text.hashCode();
}

(テキストはnullではないと思います。nullの可能性がある場合は、それを考慮してNPEを無効にする必要があります)

于 2012-10-12T11:21:40.390 に答える