使用对象删除 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 错误,因为您正在比较 Iterator
和 Element
,它们是完全不同类型的对象。您想要将该元素与您之前保存到局部变量的 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;
}
当我尝试删除带对象的 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 错误,因为您正在比较 Iterator
和 Element
,它们是完全不同类型的对象。您想要将该元素与您之前保存到局部变量的 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;
}