歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Java教程:實現Comparable接口

Java.lang.Comparable接口中唯一的方法是compareTo(),在該方法中可以進行簡單的相等比較以及執行順序比較,接口實現框架如下:

[java]

  1. public class ComparableImpl implements Comparable<ComparableImpl> {  
  2.   
  3.     @Override  
  4.     public int compareTo(ComparableImpl o) {  
  5.         // TODO Auto-generated method stub   
  6.         return 0;  
  7.     }  
  8.   
  9. }  

一個類實現了Comparable接口,則說明它的實例具有內在的排序關系,就可以跟多種泛型算法以及依賴於該接口的集合實現進行協作。依賴於比較關系的類包括有序集合類TreeSet和TreeMap,以及工具類Collections和Arrays。

若一個數組中的元素實現了Comparable接口,則可以直接使用Arrays類的sort方法對這個數組進行排序。Java平台庫中的所有值類(value classes)都實現了Comparable接口。

Comparable的規范說明如下:將當前這個對象與指定對象進行順序比較。當該對象小於、等於或大於指定對象時,分別返回一個負整數、零或者正整數。如果由於指定對象的類型而使得無法進行比較,則拋出ClassCastException異常。

compareTo方法的實現必須滿足如下幾個限制條件:自反性、對稱性、傳遞性和非空性。

一般來說,comparaTo方法的相等測試應該返回與equals方法相同的結果。如果相同,則由compareTo方法施加的順序關系被稱為“與equals一致”;如果不同,則順序關系被稱為“與equals不一致”。如果一個類的compareTo方法與equals方法的順序關系不一致,那麼它仍然能正常工作,只是,如果一個有序集合包含了該類的實例,則這個集合可能無法遵循某些集合接口的通用約定。因為集合接口的通用約定是按照equals方法定義的,而有序集合使用了由compareTo施加的相等測試。下面是實現了Comparable接口的類,同時,該類還重寫了equals和hashCode等方法:

[java]
  1. public abstract class ZLTextPosition implements Comparable<ZLTextPosition> {  
  2.       
  3.     public abstract int getParagraphIndex();  
  4.     public abstract int getElementIndex();  
  5.     public abstract int getCharIndex();  
  6.       
  7.     public boolean samePositionAs(ZLTextPosition position) {  
  8.         return  
  9.             getParagraphIndex() == position.getParagraphIndex() &&  
  10.             getElementIndex() == position.getElementIndex() &&  
  11.             getCharIndex() == position.getCharIndex();  
  12.     }  
  13.       
  14.     @Override  
  15.     public int compareTo(ZLTextPosition position) {  
  16.         final int p0 = getParagraphIndex();  
  17.         final int p1 = position.getParagraphIndex();  
  18.         if (p0 != p1) {  
  19.             return p0 < p1 ? -1 : 1;  
  20.         }  
  21.           
  22.         final int e0 = getElementIndex();  
  23.         final int e1 = position.getElementIndex();  
  24.         if (e0 != e1) {  
  25.             return e0 < e1 ? -1 : 1;  
  26.         }  
  27.           
  28.         final int c0 = getCharIndex();  
  29.         final int c1 = position.getCharIndex();  
  30.         if (c0 != c1) {  
  31.             return c0 < c1 ? -1 : 1;  
  32.         }  
  33.         return 0;  
  34.     }  
  35.       
  36.     @Override  
  37.     public boolean equals(Object obj) {  
  38.         if (this == obj) {  
  39.             return true;  
  40.         }  
  41.         if (!(obj instanceof ZLTextPosition)) {  
  42.             return false;  
  43.         }  
  44.           
  45.         final ZLTextPosition position = (ZLTextPosition)obj;  
  46.         return samePositionAs(position);  
  47.     }  
  48.       
  49.     @Override  
  50.     public int hashCode() {  
  51.         return (getParagraphIndex() << 16) + (getElementIndex() << 8) + getCharIndex();  
  52.     }  
  53.       
  54.     @Override  
  55.     public String toString() {  
  56.         return getClass().getName() + " " + getParagraphIndex() + " " + getElementIndex() + " " + getCharIndex();  
  57.     }  
  58.       
  59. }  
Copyright © Linux教程網 All Rights Reserved