[英]How do I write my own comparison operator in Java?
我有一個List<MyObject> list
而且,我想利用list.contains()
函數。
目前,它似乎不起作用,即列表中有匹配的對象,但沒有被比較器運算符拾取。
我猜我需要在MyObject
編寫自己的比較運算符。 怎么辦呢?
您需要覆蓋public boolean equals(Object o)
因為contains
使用它:
boolean contains(Object o)
如果此集合包含指定的元素,則返回true。 更正式地講,當且僅當此集合包含至少一個元素
(o==null ? e==null : o.equals(e))
,返回true。
請參閱如何實現hashCode和equals方法 ,以討論有關覆蓋equals
的簡單正確方法。
您需要特別小心地重寫equals(Object o)
,而不僅僅是實現equals(MyObject o)
。
您必須在MyObject
重寫equals()
。
public class MyObject
{
public boolean equals(Object obj)
{
if(this == obj)
return true;
if((obj == null) || (obj.getClass() != this.getClass()))
return false;
// object must be MyObject at this point
MyObject test = (MyObject) obj;
// Compare 'this' MyObject to 'test'
}
public int hashCode()
{
// generate your hash
}
}
您只需在MyObject類上實現自己的equals和hashcode版本。
默認的equals不會檢查您在類中定義的屬性。 這就是為什么您得到錯誤的結果。
您的課程需要實現equals()。 如果您想對對象進行排序,則實現Comparable接口也很有用。
class MyObject implements Comparable<MyObject> {
public int compareTo(MyObject o) {
// do the compare!
}
public boolean equals(Object o) {
// check equality
}
}
請注意List的contains方法的文檔: List.contains()
它聲明它使用equals方法確定相等性,因此確定該元素是否存在於列表中。
另外,請注意,當重載等於時 ,必須重載hashCode 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.