0

複数のコレクションを保持するクラスがあり、コレクションの 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;
}
4

1 に答える 1

0

コレクションからアイテムを削除するには、イテレータを使用して問題を回避するのが最善の方法です。

これでループを置き換えて、もう一度やり直してください:

for(Iterator<Person> iterator =  personBin.getMen().iterator();iterator.hasNext();){
            Person person = iterator.next();
            if(personBin.getPeople().contains(person)){
                iterator.remove();
            }
        }
于 2013-01-15T14:27:56.583 に答える