[英]Removing HashSet with Object
當我嘗試刪除帶有對象的HashSet
,即使hashset.contains(Object)
和iterator.equals(Object)
應該為true,也始終為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的功能,錯誤還是我只是在編寫錯誤的代碼? 這似乎是刪除的邏輯解決方案,但它始終會失敗而不會引發任何錯誤。
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))) {
如果您沒有重寫Element
類中的equals()
方法,則此方法也會返回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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.