JavaTM 2 Platform
Standard Ed. 6

java.lang
介面 Comparable<T>

型別參數:
T - 可以與此物件進行比較的那些物件的型別
所有已知子介面:
Delayed, Name, RunnableScheduledFuture<V>, ScheduledFuture<V>
所有已知實作類別:
Authenticator.RequestorType, BigDecimal, BigInteger, Boolean, Byte, ByteBuffer, Calendar, Character, CharBuffer, Charset, ClientInfoStatus, CollationKey, Component.BaselineResizeBehavior, CompositeName, CompoundName, Date, Date, Desktop.Action, Diagnostic.Kind, Dialog.ModalExclusionType, Dialog.ModalityType, Double, DoubleBuffer, DropMode, ElementKind, ElementType, Enum, File, Float, FloatBuffer, Formatter.BigDecimalLayoutForm, FormSubmitEvent.MethodType, GregorianCalendar, GroupLayout.Alignment, IntBuffer, Integer, JavaFileObject.Kind, JTable.PrintMode, KeyRep.Type, LayoutStyle.ComponentPlacement, LdapName, Long, LongBuffer, MappedByteBuffer, MemoryType, MessageContext.Scope, Modifier, MultipleGradientPaint.ColorSpaceType, MultipleGradientPaint.CycleMethod, NestingKind, Normalizer.Form, ObjectName, ObjectStreamField, Proxy.Type, Rdn, Resource.AuthenticationType, RetentionPolicy, RoundingMode, RowFilter.ComparisonType, RowIdLifetime, RowSorterEvent.Type, Service.Mode, Short, ShortBuffer, SOAPBinding.ParameterStyle, SOAPBinding.Style, SOAPBinding.Use, SortOrder, SourceVersion, SSLEngineResult.HandshakeStatus, SSLEngineResult.Status, StandardLocation, String, SwingWorker.StateValue, Thread.State, Time, Timestamp, TimeUnit, TrayIcon.MessageType, TypeKind, URI, UUID, WebParam.Mode, XmlAccessOrder, XmlAccessType, XmlNsForm

public interface Comparable<T>

此介面強行對實作它的每個類別的物件進行整體排序。這種排序被稱為類別的自然排序,類別的 compareTo 方法被稱為它的自然比較方法

實作此介面的物件列表(和陣列)可以通過 Collections.sort(和 Arrays.sort)進行自動排序。實作此介面的物件可以用作有序映射中的鍵或有序集合中的元素,無需指定比較器

對於類別 C 的每一個 e1e2 來說,當且僅當 e1.compareTo(e2) == 0e1.equals(e2) 具有相同的 boolean 值時,類別 C 的自然排序才叫做與 equals 一致。注意,null 不是任何類別的實例,即使 e.equals(null) 返回 falsee.compareTo(null) 也將拋出 NullPointerException

建議(雖然不是必需的)最好使自然排序與 equals 一致。這是因為在使用自然排序與 equals 不一致的元素(或鍵)時,沒有顯式比較器的有序集合(和有序映射表)行為表現「怪異」。尤其是,這樣的有序集合(或有序映射表)違背了根據 equals 方法定義的集合(或映射表)的常規協定。

例如,如果將兩個鍵 ab 添加到沒有使用顯式比較器的有序集合中,使 (!a.equals(b) && a.compareTo(b) == 0),那麼第二個 add 操作將返回 false(有序集合的大小沒有增加),因為從有序集合的角度來看,ab 是相等的。

實際上,所有實作 Comparable 的 Java 核心類別都具有與 equals 一致的自然排序。java.math.BigDecimal 是個例外,它的自然排序將值相等但精確度不同的 BigDecimal 物件(比如 4.0 和 4.00)視為相等。

從數學上講,定義給定類別 C 上自然排序的關係式 如下:

      {(x, y)|x.compareTo(y) <= 0}。
整體排序的 是:
      {(x, y)|x.compareTo(y) == 0}。
它直接遵循 compareTo 的協定,商是 C等價關係,自然排序是 C整體排序。當說到類別的自然排序與 equals 一致 時,是指自然排序的商是由類別的 equals(Object) 方法定義的等價關係。
    {(x, y)|x.equals(y)}。

此介面是 Java Collections Framework 的成員。

從以下版本開始:
1.2
另請參見:
Comparator

方法摘要
 int compareTo(T o)
          比較此物件與指定物件的順序。
 

方法詳細資訊

compareTo

int compareTo(T o)
比較此物件與指定物件的順序。如果該物件小於、等於或大於指定物件,則分別返回負整數、零或正整數。

實作類別必須確保對於所有的 xy 都存在 sgn(x.compareTo(y)) == -sgn(y.compareTo(x)) 的關係。(這意味著如果 y.compareTo(x) 拋出一個異常,則 x.compareTo(y) 也要拋出一個異常。)

實作類別還必須確保關係是可傳遞的:(x.compareTo(y)>0 && y.compareTo(z)>0) 意味著 x.compareTo(z)>0

最後,實作者必須確保 x.compareTo(y)==0 意味著對於所有的 z,都存在 sgn(x.compareTo(z)) == sgn(y.compareTo(z))。 強烈推薦 (x.compareTo(y)==0) == (x.equals(y)) 這種做法,但並不是 嚴格要求這樣做。一般來說,任何實作 Comparable 介面和違背此條件的類別都應該清楚地指出這一事實。推薦如此闡述:「注意:此類別具有與 equals 不一致的自然排序。」

在前面的描述中,符號 sgn(expression) 指定 signum 數學函數,該函數根據 expression 的值是負數、零還是正數,分別返回 -101 中的一個值。

參數:
o - 要比較的物件。
返回:
負整數、零或正整數,根據此物件是小於、等於還是大於指定物件。
拋出:
ClassCastException - 如果指定物件的型別不允許它與此物件進行比較。

JavaTM 2 Platform
Standard Ed. 6

提交錯誤或意見

版權所有 2008 Sun Microsystems, Inc. 保留所有權利。請遵守GNU General Public License, version 2 only