【问题标题】:Removing HashSet with Object用 Object 移除 HashSet
【发布时间】:2015-06-18 19:51:43
【问题描述】:

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

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

【问题讨论】:

    标签: java iterator hashset


    【解决方案1】:
    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))) {
    

    如果您没有覆盖 Element 类中的 equals() 方法,这也会返回 false。使用默认的Object.equals() 方法,该方法指示两个引用应该引用 same 对象以便相等。在这种情况下,您将与使用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;
    }
    

    【讨论】:

    • 但是甚至不检查equals()的简单代码都会失败,例如:boolean removed = elements.remove(new Element(element.eString, element.eInt, element.eBoolean)); return removed;
    • 澄清一下:将itr.equals... 修复为oldGreeter.equals... 解决了我的问题,我只是想知道为什么boolean removed... 不起作用。
    • @OP:HashSet.remove() 在内部使用您的类的equals() 方法来执行删除操作。所以它会因为同样的原因而失败。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-30
    • 1970-01-01
    • 2011-11-20
    • 1970-01-01
    • 2020-02-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多