[英]Add no duplicates to List of supperclass (check for equality with subclasses)
我有一個List<Item> items = new ArrayList<>();
我將兩個不同的Item
添加到Item
兩個子類: PortableItem
和SceneryItem
。
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.