簡體   English   中英

如何用Java編寫自己的比較運算符?

[英]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.

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