removeAll(Collection<?> a)
コレクション内のオブジェクトが削除されていないのに、なぜtrue を返すのですか? カスタム オブジェクトの hashcode と equals メソッドをオーバーライドします。入力からのオブジェクトのハッシュコードは、選択範囲内のオブジェクトのハッシュコードと同じです。
private void onRemove(IStructuredSelection selection) {
boolean removeAll = getInput().removeAll(selection.toList()); // returns true
Set<ReadingNodeCfg> input = getInput(); // Object from selection is still there
}
入力からのオブジェクトは選択内のオブジェクトと同じですが、なぜ彼はそれを削除しないのでしょうか?
よろしくお願いします
edit1 : eclipse で equals と hashcode を生成しました。getInput() は a を返しHashSet<ReadingNodeCfg>
、selection.toList() は a を返します。List<ReadingNodeCfg>
edit2 :
for (Object object : selection.toList()) {
boolean remove = getInput().remove(object); // returns false
int hashCode = object.hashCode(); // returns 1130504316
int hashCode2 = getInput().iterator().next().hashCode(); // returns 1130504316
boolean equals = object.equals(getInput().iterator().next()); // returns true
}
edit3 : 現在、IObservableList を使用しています。それは今うまくいきます!
変更後の入力でハッシュコードが変更されました。そして、削除したいオブジェクトには、変更された入力オブジェクトと同じハッシュコードがありましたが、とにかく機能せず、その理由はまだわかりません。
解決:
さて、私は今問題を解決しました。同じ問題を抱えている他の人のために例を作成しました。
@Test
public void derp() {
Person person = new Person();
person.name = "jay";
Set<Person> humans = new HashSet<>();
humans.add(person);
person.name = "fred";
assertTrue(!humans.remove(person));
}
person
このオブジェクトは、変更後に削除することはできません。person
ハッシュセットは、オブジェクト自体のハッシュコードを見つけることができません。
- のハッシュコード
person
: 1337 - ハッシュコードに追加すると、このハッシュコードとオブジェクトの間の参照のようなものが作成されます
- 人の名前を変更すると、ハッシュコードが変更されます: 1338
- ハッシュコードからこのオブジェクトを削除すると、ハッシュコード 1337 のオブジェクトを削除しようとしますが、うまくいきません
- quals/hashcode をオーバーライドしない場合、問題なくこのアイテムを削除できます
よろしくお願いします