摘要:一內(nèi)部排序接口實(shí)現(xiàn)該接口的類(lèi),支持自然排序內(nèi)排序。方法與方法不一致。在有序集合看來(lái)和是相等的,因此第個(gè)鍵無(wú)法被添加到集合中。
一、Comparable(內(nèi)部排序接口)
實(shí)現(xiàn)該接口的類(lèi),支持自然排序(內(nèi)排序)。Arrays.sort(Object[])和Collection.sort(Object[])要求對(duì)象必須實(shí)現(xiàn)Comparable接口
文檔中指出:
如果該對(duì)象大于指定對(duì)象,返回正整數(shù)
如果該對(duì)象等于指定對(duì)象,返回0
如果該對(duì)象小于指定對(duì)象,返回負(fù)整數(shù)
建議(x.compareTo(y)==0) == x.equals(y)
e.compareTo(null) 應(yīng)該拋出NullPointerException
鍵a和b被添加到?jīng)]有指定顯示比較器的有序集合中。if(!a.equals(b) && a.compareTo(b))(eqauls方法與compareTo方法不一致)。在有序集合看來(lái)a和b是相等的,因此第2個(gè)鍵無(wú)法被添加到集合中。
針對(duì)第6點(diǎn)可以舉個(gè)例子:
BigDecimal類(lèi)的compareTo 與 equals 方法不一致。
public static void main(String[] args) { Mapmap = new HashMap (); BigDecimal b1 = new BigDecimal(1.0); BigDecimal b2 = new BigDecimal(1.00); map.put(b1,"c1"); map.put(b2,"c2"); System.out.println(map.get(b1) + " " + map.get(b2)); // 輸出 c1、c2 TreeSet set = new TreeSet (); set.add(b1); set.add(b2); for(BigDecimal b : set) { System.out.println(b.floatValue()); // 只打印出1.0 } }
HashMap通過(guò) hashCode + equals 方法進(jìn)行比較。 TreeSet 通過(guò) compareTo進(jìn)行比較。
在effctiveJava中 指出,Comparable接口,具有與equals方法一樣的自反、傳遞、對(duì)稱(chēng)。所以同樣與equals具有同樣的特征:
沒(méi)有一種簡(jiǎn)單的方法可以做到,在擴(kuò)展一個(gè)新的可實(shí)例化的類(lèi)時(shí),既增加了新的特征,又保持了compareTo的約定(見(jiàn)我的文章)
對(duì)于如何編寫(xiě)compareTo方法,effectivejava中,同樣給出了以下建議。并且推薦,自定義的類(lèi),可以考慮實(shí)現(xiàn)Comparable接口
實(shí)參為null,compareTo方法應(yīng)拋出NullPointerException
參數(shù)不合適,應(yīng)拋出ClassCastException
比較對(duì)象引用域,通過(guò)遞歸比較
如果對(duì)象有多個(gè)域,則從最重要的域開(kāi)始比較
compareTo沒(méi)有指定返回值的大小,而只是指定返回值的符號(hào),可利用這點(diǎn)進(jìn)行優(yōu)化
例子:
public int compareTo(Object obj) { if(obj == null) { throw new NullPointerException(); // 滿足第1點(diǎn) } if(!(obj instanceof MyComparable)) { throw new ClassCastException(); // 滿足第2點(diǎn) } MyComparable o = (MyComparable) obj; int x = o.p.compareTo(p);// p 是一個(gè)對(duì)象 ,滿足第3、4點(diǎn) if(x == 0) { return o.y - y; // y 是個(gè)int型, 滿足第5點(diǎn), //對(duì)于第5點(diǎn)請(qǐng)注意,確保 o.y -y 不會(huì)溢出?。?! } return x; }二、Comparator(外部比較器)
可自己制定比較規(guī)則。在TreeSet中有應(yīng)用,TresSet利用Comparator接口實(shí)現(xiàn)模板設(shè)計(jì)模式
文檔中指出:
如果該對(duì)象大于指定對(duì)象,返回正整數(shù)
如果該對(duì)象等于指定對(duì)象,返回0
如果該對(duì)象小于指定對(duì)象,返回負(fù)整數(shù)
建議(x.compareTo(y)==0) == x.equals(y)
必須確保關(guān)系的傳遞性。即compare(x,y) > 0 且 compare(y,z) > 0,那么 compare(x,z) > 0
在本人看來(lái),Comparable 與 Comparator 差別不大
疑問(wèn):那么Comparator具體的使用在什么地方呢?
JAVA API 的String 類(lèi) 默認(rèn)實(shí)現(xiàn)了Comparable接口,有默認(rèn)的排序方式,但是如果我們想使用自己的排序方式呢?比如按照長(zhǎng)度排序,那么就可以使用Comparator接口了。
class LengthComparator implements Comparator{ @Override public int compare(String o1, String o2) { return o1.length() - o2.length(); } }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/70543.html
摘要:和方法可以對(duì)數(shù)組進(jìn)行排序,但是這種方法排序要求對(duì)象所在的類(lèi)必須實(shí)現(xiàn)接口,此接口用于指定排序規(guī)則如果一個(gè)類(lèi)已經(jīng)開(kāi)發(fā)完成,但是在此類(lèi)建立的初期并沒(méi)有實(shí)現(xiàn)接口,此時(shí)肯定是無(wú)法進(jìn)行對(duì)象排序操作的,所以為了解決這個(gè)問(wèn)題,定義了另一個(gè)比較器的操 Collections.sort() 和 Arrays.sort()方法可以對(duì)Object數(shù)組進(jìn)行排序,但是這種方法排序要求對(duì)象所在的類(lèi)必須實(shí)現(xiàn)Compa...
摘要:中的一切類(lèi)都是繼承于,在中實(shí)現(xiàn)了函數(shù)所以,其它所有的類(lèi)也相當(dāng)于都實(shí)現(xiàn)了該函數(shù)。是比較和的大小。返回負(fù)數(shù),意味著比小返回零,意味著等于返回正數(shù),意味著大于。 Comparable Comparable 是排序接口。 Collection.sort() 和Arrays.sort()都支持可以排序?qū)崿F(xiàn)Comparable接口的類(lèi)的對(duì)象的List列表(或數(shù)組) 換而言之, 如果數(shù)組或列表想支持...
對(duì)象排序 List l可以如下排序。 Collections.sort(l); 如果List包含String元素,它將按字母順序排序,如果它由Date元素組成,它將按時(shí)間順序排序,這是怎么發(fā)生的?String和Date都實(shí)現(xiàn)了Comparable接口,Comparable實(shí)現(xiàn)為類(lèi)提供了自然的順序,允許該類(lèi)的對(duì)象自動(dòng)排序,下表總結(jié)了一些實(shí)現(xiàn)Comparable的更重要的Java平臺(tái)類(lèi)。 類(lèi) 自然...
摘要:,又名比較器,是為了比較兩個(gè)對(duì)象的大小而抽象出的一個(gè)接口。在排序的時(shí)候常需要實(shí)現(xiàn)這個(gè)接口來(lái)定制比較規(guī)則。若函數(shù)的返回值大于,那么在排序后會(huì)將放在的后面。 Comparator,又名比較器,是為了比較兩個(gè)對(duì)象的大小而抽象出的一個(gè)接口。在排序的時(shí)候常需要實(shí)現(xiàn)這個(gè)接口來(lái)定制比較規(guī)則。 但是很多人用的時(shí)候不清楚該如何使用這個(gè)接口,下面我就講一下這個(gè)接口的正確使用方法!這個(gè)接口里有一個(gè)必須實(shí)現(xiàn)的...
摘要:與辨析聲明文章均為本人技術(shù)筆記,轉(zhuǎn)載請(qǐng)注明出處比較三種狀態(tài)根據(jù)需求定義序升序降序返回負(fù)數(shù),表示比較兩元素滿足序,無(wú)須調(diào)整,返回,表示比較兩元素相等,無(wú)須調(diào)整位置,返回正數(shù),表示比較兩元素不滿足序,按序調(diào)整位置對(duì)象內(nèi)部排序源碼繼承接口的對(duì)象必 Comparator與Comparable辨析 聲明 文章均為本人技術(shù)筆記,轉(zhuǎn)載請(qǐng)注明出處:[1] https://segmentfault.co...
閱讀 2787·2021-11-19 11:30
閱讀 3069·2021-11-15 11:39
閱讀 1793·2021-08-03 14:03
閱讀 1999·2019-08-30 14:18
閱讀 2055·2019-08-30 11:16
閱讀 2169·2019-08-29 17:23
閱讀 2611·2019-08-28 18:06
閱讀 2545·2019-08-26 12:22