Java朝花夕拾の实现Comparable接口
Java.lang.Comparable接口中唯一的方法是compareTo(),在該方法中可以進(jìn)行簡單的相等比較以及執(zhí)行順序比較,接口實(shí)現(xiàn)框架如下:
public class ComparableImpl implements Comparable<ComparableImpl> { @Override public int compareTo(ComparableImpl o) { // TODO Auto-generated method stub return 0; } }
一個(gè)類實(shí)現(xiàn)了Comparable接口,則說明它的實(shí)例具有內(nèi)在的排序關(guān)系,就可以跟多種泛型算法以及依賴于該接口的集合實(shí)現(xiàn)進(jìn)行協(xié)作。依賴于比較關(guān)系的類包括有序集合類TreeSet和TreeMap,以及工具類Collections和Arrays。
若一個(gè)數(shù)組中的元素實(shí)現(xiàn)了Comparable接口,則可以直接使用Arrays類的sort方法對(duì)這個(gè)數(shù)組進(jìn)行排序。Java平臺(tái)庫中的所有值類(value?classes)都實(shí)現(xiàn)了Comparable接口。
Comparable的規(guī)范說明如下:將當(dāng)前這個(gè)對(duì)象與指定對(duì)象進(jìn)行順序比較。當(dāng)該對(duì)象小于、等于或大于指定對(duì)象時(shí),分別返回一個(gè)負(fù)整數(shù)、零或者正整數(shù)。如果由于指定對(duì)象的類型而使得無法進(jìn)行比較,則拋出ClassCastException異常。
compareTo方法的實(shí)現(xiàn)必須滿足如下幾個(gè)限制條件:自反性、對(duì)稱性、傳遞性和非空性。
一般來說,comparaTo方法的相等測(cè)試應(yīng)該返回與equals方法相同的結(jié)果。如果相同,則由compareTo方法施加的順序關(guān)系被稱為“與equals一致”;如果不同,則順序關(guān)系被稱為“與equals不一致”。如果一個(gè)類的compareTo方法與equals方法的順序關(guān)系不一致,那么它仍然能正常工作,只是,如果一個(gè)有序集合包含了該類的實(shí)例,則這個(gè)集合可能無法遵循某些集合接口的通用約定。因?yàn)榧辖涌诘耐ㄓ眉s定是按照equals方法定義的,而有序集合使用了由compareTo施加的相等測(cè)試。下面是實(shí)現(xiàn)了Comparable接口的類,同時(shí),該類還重寫了equals和hashCode等方法:
public abstract class ZLTextPosition implements Comparable<ZLTextPosition> { public abstract int getParagraphIndex(); public abstract int getElementIndex(); public abstract int getCharIndex(); public boolean samePositionAs(ZLTextPosition position) { return getParagraphIndex() == position.getParagraphIndex() && getElementIndex() == position.getElementIndex() && getCharIndex() == position.getCharIndex(); } @Override public int compareTo(ZLTextPosition position) { final int p0 = getParagraphIndex(); final int p1 = position.getParagraphIndex(); if (p0 != p1) { return p0 < p1 ? -1 : 1; } final int e0 = getElementIndex(); final int e1 = position.getElementIndex(); if (e0 != e1) { return e0 < e1 ? -1 : 1; } final int c0 = getCharIndex(); final int c1 = position.getCharIndex(); if (c0 != c1) { return c0 < c1 ? -1 : 1; } return 0; } @Override public boolean equals(Object obj) { if (this == obj) { return true; } if (!(obj instanceof ZLTextPosition)) { return false; } final ZLTextPosition position = (ZLTextPosition)obj; return samePositionAs(position); } @Override public int hashCode() { return (getParagraphIndex() << 16) + (getElementIndex() << 8) + getCharIndex(); } @Override public String toString() { return getClass().getName() + " " + getParagraphIndex() + " " + getElementIndex() + " " + getCharIndex(); } }總結(jié)
以上是生活随笔為你收集整理的Java朝花夕拾の实现Comparable接口的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 快速配置 Samba
- 下一篇: perl学习笔记(8)