摘要:,又名比較器,是為了比較兩個對象的大小而抽象出的一個接口。在排序的時候常需要實現這個接口來定制比較規則。若函數的返回值大于,那么在排序后會將放在的后面。
Comparator,又名比較器,是為了比較兩個對象的大小而抽象出的一個接口。
在排序的時候常需要實現這個接口來定制比較規則。
但是很多人用的時候不清楚該如何使用這個接口,下面我就講一下這個接口的正確使用方法!
這個接口里有一個必須實現的方法(因為java8之后有的接口里的部分方法是有默認實現的,所以
不再是接口里的每個方法都必須實現了)
public int compare(Object o1, Object o2) { return 0; }
只要重寫這個方法,就能夠定制自己想要的排序規則,但是這個方法該如何正確的使用呢?
從方法名上看,這個方法叫做比較(compare),這是一個及其模糊的名字,因為比較本身
就是雙向的定義,本來就是個不清楚的定義,比如o1比o2小算是比較,而o2比o1大也是比較
可是它們表述的是同一件事情?。。?/p>
一個比較簡單的理解方式是。
若函數的返回值小于0,那么在排序后會將o1放在o2的前面。
若函數的返回值大于0,那么在排序后會將o1放在o2的后面。
若函數的返回值等于0,那么在排序后兩者前后順序不定。
比如:
Integer[] nums = new Integer[]{1,7,3,5,4}; Arrays.sort(nums, new Comparator() { @Override public int compare(Integer o1, Integer o2) { if(o1 < o2)return -1; if(o1 > o2)return 1; return 0; } }); for (int i:nums) System.out.println(i);
輸出結果為
1
3
4
5
7
它有一個類似的接口Comparable,這個接口往往是可比較類實現的,它不像Comparator
往往是寫成一個匿名類,換句話說如果一個類想要自身帶有可比較這個行為,那么它就要實現這個
接口。而這個接口里也有一個方法compareTo
public int compareTo(Object o) { return 0; }
也是比較的意思,不過這里只有一個參數,比較是兩個對象之間的事情,因此一定有
第二個對象才能夠比較,實際上這里有第二個對象,那就是this,也就是這個可比較類
本身,這里相當于this是第一個參數,而o是第二個參數,只是this不需要寫出,因為這個方法就是
this自身的,從邏輯上來看相當于this比較o,理解了這個就能夠理解下面的代碼了:
class MyEntity implements Comparable{ private int val; @Override public int compareTo(MyEntity o) { if(this.val < o.val)return -1; if(this.val > o.val)return 1; return 0; } }
一般來講,Comparator使用的更多,因為如果一個類實現了Comparable接口,那么一般來講它就具有了
一種不可變的比較方法,即使可以通過控制變量來使得compareTo這個方法具有可變性(比如使其從this比較o變成o比較this),但從面向對象的角度來看這也是不正確的,因為一個對象一旦是可比較的,那么可比較的邏輯就應該是確定的。不過Comparator則不同,可以隨時定制,隨時根據需求隨時更改,因為它不是被可比較類實現,因此即使更改也不破環可比較類的內部比較邏輯!
最后說一下,java8之后有了lambda表達式,使得代碼可以寫成下面這樣,使得代碼簡化了很多:
Integer[] nums = new Integer[]{1,7,3,5,4}; Arrays.sort(nums, (o1,o2)->{ if(o1 < o2)return -1; if(o1 > o2)return 1; return 0; }); for (int i:nums) System.out.println(i);
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/72863.html
摘要:實體類接口重寫方法,業務排序類接口重寫方法這兩個接口我們非常的熟悉,但是在用的時候會有一些不知道怎么下手的感覺,現在用案例進行總結,消除對這個知識點的理解盲區個人的理解,如果有錯誤請多多指教。 實體類:java.lang.Comparable(接口) + comareTo(重寫方法),業務排序類 java.util.Comparator(接口) + compare(重寫方法). 這兩...
摘要:一內部排序接口實現該接口的類,支持自然排序內排序。方法與方法不一致。在有序集合看來和是相等的,因此第個鍵無法被添加到集合中。 一、Comparable(內部排序接口) 實現該接口的類,支持自然排序(內排序)。Arrays.sort(Object[])和Collection.sort(Object[])要求對象必須實現Comparable接口 文檔中指出: 如果該對象大于指定對象,返回...
對象排序 List l可以如下排序。 Collections.sort(l); 如果List包含String元素,它將按字母順序排序,如果它由Date元素組成,它將按時間順序排序,這是怎么發生的?String和Date都實現了Comparable接口,Comparable實現為類提供了自然的順序,允許該類的對象自動排序,下表總結了一些實現Comparable的更重要的Java平臺類。 類 自然...
摘要:中的一切類都是繼承于,在中實現了函數所以,其它所有的類也相當于都實現了該函數。是比較和的大小。返回負數,意味著比小返回零,意味著等于返回正數,意味著大于。 Comparable Comparable 是排序接口。 Collection.sort() 和Arrays.sort()都支持可以排序實現Comparable接口的類的對象的List列表(或數組) 換而言之, 如果數組或列表想支持...
摘要:與辨析聲明文章均為本人技術筆記,轉載請注明出處比較三種狀態根據需求定義序升序降序返回負數,表示比較兩元素滿足序,無須調整,返回,表示比較兩元素相等,無須調整位置,返回正數,表示比較兩元素不滿足序,按序調整位置對象內部排序源碼繼承接口的對象必 Comparator與Comparable辨析 聲明 文章均為本人技術筆記,轉載請注明出處:[1] https://segmentfault.co...
閱讀 1751·2021-09-23 11:34
閱讀 2472·2021-09-22 15:45
閱讀 12821·2021-09-22 15:07
閱讀 2221·2021-09-02 15:40
閱讀 4107·2021-07-29 14:48
閱讀 1071·2019-08-30 15:55
閱讀 3245·2019-08-30 15:55
閱讀 2190·2019-08-30 15:55