たとえば、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();
}
しかし、複数のフィールドを持つより複雑なクラスがある場合、このメソッドをどのように実装すればよいでしょうか?