複数のコレクションを保持するクラスがあり、コレクションの 1 つからいくつかのオブジェクトを削除する際に問題が発生しています。collection.contains(object) を呼び出すと true が返され、次の行で collection.remove(object) を呼び出すと、オブジェクトは削除されません。
これは、機能しなかった元のコードです。コレクションはすべて SortedSet です。ここで私を混乱させたのは、男性コレクションが人物コレクションから直接取り込まれていることですが、人物コレクションから男性オブジェクトを削除しようとすると、それらのすべてが削除されるわけではありません.
for(Person person : peopleBin.getPeople())
{
if(person.isMale())
{
peopleBin.getMen().add(person);
}
}
peopleBin.getPeople().removeAll(peopleBin.getMen());
Person には次のような equals メソッドがあります
public boolean equals( Object obj )
{
if ( obj == null )
return false;
if ( !(obj instanceof Person) )
return false;
Person that = (Person)obj;
return
that.age == age &&
that.id == id &&
that.someCount == someCount ;
}
最初のスニペットの removeAll 行をこれに置き換えると、奇妙な動作が発生します。
for(Person person: personBin.getMen())
{
if(personBin.getPeople().contains(person))
personBin.getPeople().remove(person);
}
if(personBin.getPeople().contains(person)) は常に true を返しますが、personBin.getPeople().remove(person) は常に削除するとは限りません。するときもあるし、しないときもある。
すべてのクラス名とフィールド名を一般的なものに変更して、パブリック フォーラムに投稿しました。
どんな助けでも大歓迎です!
編集:ここにcompareTo実装があります
public int compareTo (Object o)
{
if ( ! ( o instanceof Person) )
{
throw new ClassCastException();
}
Person that = (Person)o;
int comparison = 0;
return
( (comparison = this.age () - that.age ()) != 0 ? comparison :
( (comparison = this.id - that.id) != 0 ? comparison :
( (comparison = this.someCount - that.someCount ))));
}
編集: これは hashCode impl です
public int hashCode() {
int result = 31;
result = 61*result + age;
result = 61*result + id;
result = 61*result + someCount;
return result;
}