簡體   English   中英

不向超級類列表添加任何重復項(檢查子類是否相等)

[英]Add no duplicates to List of supperclass (check for equality with subclasses)

我有一個List<Item> items = new ArrayList<>(); 我將兩個不同的Item添加到Item兩個子類: PortableItemSceneryItem

public class Item implements Comparable<item> {
    public String id;
    public String desc;

    ...

    public int compareTo(Item o) {
        return getId().compareTo(o.getId());
    }  
}

現在,我想在將新ID添加到列表之前檢測ID的項目。

    PortableItem a = new PortableItem("a");
    SceneryItem b  = new SceneryItem("a");
    items.add(a);
    items.contains(b); 

返回false。 我該如何改變這種行為?

您可以添加一個與id進行比較的equals方法,默​​認情況下,當Object ==時, Object等於另一個-即同一實例。 這不是你想要的。

public class Item implements Comparable<Item> {

    public String id;
    public String desc;

    public String getId() {
        return id;
    }

    @Override
    public int compareTo(Item o) {
        return getId().compareTo(o.getId());
    }

    @Override
    public int hashCode() {
        int hash = 7;
        hash = 17 * hash + Objects.hashCode(this.id);
        return hash;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == this) {
            return true;
        }
        if (!(obj instanceof Item)) {
            return false;
        }
        final Item other = (Item) obj;
        if (!Objects.equals(this.id, other.id)) {
            return false;
        }
        return true;
    }
}

無論如何,給定您的compareTo方法和與equals一致的要求,這確實是一個好習慣-現在a.equals(b)如果具有相同的id則將返回true。

當您現在擁有一個equals方法時,您必須具有一個hashCode()方法,這也是與equals要求一致的方法。

請注意,如果您在超類中覆蓋equals方法,那么除非您使用調用最后return super.equals ,否則這顯然將不起作用。

現在,使用List可以確保contains方法O(n)-這非常慢 我建議使用一個contains保證為O(1)的Set 如果您需要維護訂單,請使用LinkedHashSet或更好的TreeSet ,它將使用您的compareTo方法自動訂購商品。

無論如何,您總是可以事后通過一個O(n)調用將其轉換為List

您需要重寫基類中的equals()hashCode()方法以按ID進行比較。
compareTo()僅用於排序。

暫無
暫無

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

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