使用对象删除 HashSet

Removing HashSet with Object

当我尝试删除带对象的 HashSet 时,hashset.contains(Object)iterator.equals(Object) 始终为假,即使它们应该为真。

public boolean removeElement(Element element)
{        
    Iterator<Element> itr = elements.iterator();
    while (itr.hasNext()) {
        Element oldElement = itr.next();
        if (itr.equals(new Element(element.eString, element.eInt, element.eBoolean))) {
            itr.remove();
            return true;
        }
        if (elements.contains(new Element(element.eString, element.eInt, element.eBoolean))) {
            elements.remove(new Element(element.eString, element.eInt, element.eBoolean));
            return true;
        }
    }
    return false;
}

这是 Java 的一个特性,一个错误,还是我只是编码错误?这似乎是删除的合乎逻辑的解决方案,但它总是会失败而不会引发任何错误。

itr.equals(new Element(element.eString, element.eInt, element.eBoolean))

这将 总是 return 错误,因为您正在比较 IteratorElement,它们是完全不同类型的对象。您想要将该元素与您之前保存到局部变量的 itr.next() 进行比较。

if (elements.contains(new Element(element.eString, element.eInt, element.eBoolean))) {

如果您没有覆盖 class Element 中的 equals() 方法,这也会 return 错误。使用默认的 Object.equals() 方法,它规定两个引用应该引用 相同的 对象才能相等。在这种情况下,您要与使用 new Element(element.eString, element.eInt, element.eBoolean) 创建的新对象进行比较。要解决此问题,您需要重写 equals 方法以指定必须如何检查 Element 类型的对象是否相等。

例如,如果 Element 具有以下字段:

String eString;
int eInt;
boolean eBoolean;

然后你可以覆盖equals如下:

@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    Element other = (Element) obj;
    if (eBoolean != other.eBoolean)
        return false;
    if (eInt != other.eInt)
        return false;
    if (eString == null) {
        if (other.eString != null)
            return false;
    } else if (!eString.equals(other.eString))
        return false;
    return true;
}