簡體   English   中英

從java列表中刪除相同的項目

[英]Remove equal item from java list

我有一個項目列表,其中每個項目都是一個包含2個公共字符串的簡單類。 我有一個equals方法,只使用兩個字符串的equalsIgnoreCase methot。

public class data
{
    public String a;
    public String b;

    public boolean equals(data d)
    {
        if(a.equalsIgnoreCase(d.a) && b.equalsIgnoreCase(d.b))
        {
            return true;
        }
        else
        {
            return false;
        }
    }
}

我希望能夠刪除一個元素,即使它與列表中的元素不同,但是等於它。

現在我這樣做:

public void remove(data dataToRemove)
{
    for(data i : _list)
    {
        if(i.equals(dataToRemove))
        {
            _list.remove(i);
            break;
        }
    }
}

有一個更好的方法嗎?

一些評論:

  • 你的equals方法不會覆蓋Objectequals方法(參數應該是Object類型,而不是data類型)。
  • 你應該改進你的equals方法來計算空值等。
  • 最后,當你重寫equals()時,你也應該覆蓋hashcode() - 如果不是,你可能會在使用Sets或Maps時遇到一些奇怪的行為。

如果正確覆蓋equals方法,則可以使用remove方法。 請參閱下面的Netbeans生成的自動生成的equalshashcode ,修改為使用equalsIgnoreCase方法。

public static void main(String[] args) {
    List<Data> list = new ArrayList<Data>();
    list.add(new Data("a", "b"));
    list.add(new Data("a", "c"));
    System.out.println(list.size()); //2
    list.remove(new Data("A", "b"));
    System.out.println(list.size()); //1
}

public static class Data {

    public String a;
    public String b;

    public Data(String a, String b) {
        this.a = a;
        this.b = b;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) return false;
        if (getClass() != obj.getClass()) return false;
        final Data other = (Data) obj;
        boolean sameA = (this.a == other.a) || (this.a != null && this.a.equalsIgnoreCase(other.a));
        if (!sameA) return false;
        boolean sameB = (this.b == other.b) || (this.b != null && this.b.equalsIgnoreCase(other.b));
        if (!sameB) return false;
        return true;
    }

    @Override
    public int hashCode() {
        int hash = 3;
        hash = 89 * hash + (this.a == null ? 0 :this.a.toUpperCase().hashCode());
        hash = 89 * hash + (this.b == null ? 0 : this.b.toUpperCase().hashCode());
        return hash;
    }

}

最明確的方法是在沒有任何循環的情況下調用列表的Remove方法,並在對象中傳入參數。 它使用您在對象上定義的equals方法來查找並刪除它(如果它存在於列表中)。

_list.remove(data);

您也不必指定哈希碼方法,但是當您在集合或地圖等集合中使用它時,您應該養成在重寫equals方法時始終創建一個方法的習慣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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