当我尝试删除带有对象的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的一个特性,一个错误,还是我只是编码错了?这似乎是删除的逻辑解决方案,但它总是失败而不会抛出任何错误。
答案 0 :(得分:0)
itr.equals(new Element(element.eString, element.eInt, element.eBoolean))
这将始终返回false,因为您正在将Iterator
与Element
进行比较,这些对象类型完全不同。您希望将先前保存的元素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;
}