使用对象

时间:2015-06-18 19:51:43

标签: java iterator hashset

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

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的一个特性,一个错误,还是我只是编码错了?这似乎是删除的逻辑解决方案,但它总是失败而不会抛出任何错误。

1 个答案:

答案 0 :(得分:0)

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

这将始终返回false,因为您正在将IteratorElement进行比较,这些对象类型完全不同。您希望将先前保存的元素itr.next()与本地变量进行比较。

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

如果你没有覆盖类equals()中的Element方法,那么这也会返回false。使用默认的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;
}