Java 集合包含对象,但无法将其删除

Java 集合包含对象,但无法将其删除,java,collections,Java,Collections,我有一个包含多个集合的类,从其中一个集合中删除某些对象时遇到问题。如果调用collection.containsobject,则返回true,然后在下一行调用collection.removeobject,对象不会被删除 for(Person person : peopleBin.getPeople()) { if(person.isMale()) { peopleBin.getMen().add(person);

我有一个包含多个集合的类,从其中一个集合中删除某些对象时遇到问题。如果调用collection.containsobject,则返回true,然后在下一行调用collection.removeobject,对象不会被删除

    for(Person person : peopleBin.getPeople())
    {
        if(person.isMale())
        {
            peopleBin.getMen().add(person);
        }
    }
    peopleBin.getPeople().removeAll(peopleBin.getMen());
这是不起作用的原始代码。所有集合都是分类集。让我感到困惑的是,男性集合是直接从people集合中填充的,但是当您尝试从people集合中删除男性对象时,并不是所有对象都将被删除

    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);
    } 
ifpersonBin.getPeople.containsperson始终返回true,但personBin.getPeople.removeperson并不总是删除。有时会,有时不会

我已经把所有的类名和字段名都改为通用的,以便在公共论坛上发布

任何帮助都将不胜感激

编辑:这里是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;
}

要从集合中删除项,最好的方法是使用迭代器以避免任何问题:

将您的循环替换为该循环,然后重试:

for(Iterator<Person> iterator =  personBin.getMen().iterator();iterator.hasNext();){
            Person person = iterator.next();
            if(personBin.getPeople().contains(person)){
                iterator.remove();
            }
        }

我们能看到比较器的实现吗?或者,如果您只是使用自然排序,请将底部示例中的代码切换到ifpeopleBin.getPeople.removeperson{printlnRemoved+person;}或者{printlnWidtremove+person;},然后查看是否可以识别任何模式。是否收到任何错误消息?您是否尝试过使用调试器?是的,确实如此-具体地说,它会破坏整个集合,或多或少是不可恢复的。这就是为什么您应该只将不可修改的对象放入一个集合中。如果我是你,我会尝试看看不同的集合实现是否仍会出现错误。到目前为止,您提供的代码看起来或多或少都不错,但到目前为止,出现此类错误的最常见原因是修改对象、错误的比较器/哈希代码实现或错误的equals实现。要清楚,它在列表中没有问题,只是不在Set中或作为映射键,正如集合javadoc中指定的:注意:如果可变对象被用作集合元素,则必须非常小心。当对象是集合中的元素时,如果对象的值以影响相等比较的方式更改,则不会指定集合的行为。这种禁止的一种特殊情况是,不允许集合本身包含为元素。