我有一个包含多个集合的类,我在从其中一个集合中删除某些对象时遇到问题。如果我调用collection.contains(object)它返回true然后在下一行我调用collection.remove(object)并且该对象不会被删除。
这是原始代码无效。所有集合都是SortedSets。让我感到困惑的是,男性收藏品是直接从人物收藏中填充的,但是当你试图从人物收藏中删除男性物品时,并不是所有人都会被删除。
for(Person person : peopleBin.getPeople())
{
if(person.isMale())
{
peopleBin.getMen().add(person);
}
}
peopleBin.getPeople().removeAll(peopleBin.getMen());
人有一个像这样的平等方法
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 impl
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;
}
答案 0 :(得分:0)
要从集合中删除项目,最好的方法是使用迭代器来避免任何问题:
用此替换你的循环,然后再试一次:
for(Iterator<Person> iterator = personBin.getMen().iterator();iterator.hasNext();){
Person person = iterator.next();
if(personBin.getPeople().contains(person)){
iterator.remove();
}
}