簡體   English   中英

使用對象刪除HashSet

[英]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,因為您正在將IteratorElement完全不同的對象進行比較。 您想將元素與先前保存到本地變量的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM