成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

如何理解java里的Comparator和Comparable

sydMobile / 3011人閱讀

摘要:,又名比較器,是為了比較兩個(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)的方法(因?yàn)閖ava8之后有的接口里的部分方法是有默認(rèn)實(shí)現(xiàn)的,所以
不再是接口里的每個(gè)方法都必須實(shí)現(xiàn)了)

    public int compare(Object o1, Object o2) {
        return 0;
    }

只要重寫(xiě)這個(gè)方法,就能夠定制自己想要的排序規(guī)則,但是這個(gè)方法該如何正確的使用呢?
從方法名上看,這個(gè)方法叫做比較(compare),這是一個(gè)及其模糊的名字,因?yàn)楸容^本身
就是雙向的定義,本來(lái)就是個(gè)不清楚的定義,比如o1比o2小算是比較,而o2比o1大也是比較
可是它們表述的是同一件事情?。?!

一個(gè)比較簡(jiǎn)單的理解方式是。
若函數(shù)的返回值小于0,那么在排序后會(huì)將o1放在o2的前面。

若函數(shù)的返回值大于0,那么在排序后會(huì)將o1放在o2的后面。

若函數(shù)的返回值等于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);

輸出結(jié)果為
1
3
4
5
7

它有一個(gè)類似的接口Comparable,這個(gè)接口往往是可比較類實(shí)現(xiàn)的,它不像Comparator
往往是寫(xiě)成一個(gè)匿名類,換句話說(shuō)如果一個(gè)類想要自身帶有可比較這個(gè)行為,那么它就要實(shí)現(xiàn)這個(gè)
接口。而這個(gè)接口里也有一個(gè)方法compareTo

  public int compareTo(Object o) {

        return 0;
    }

也是比較的意思,不過(guò)這里只有一個(gè)參數(shù),比較是兩個(gè)對(duì)象之間的事情,因此一定有
第二個(gè)對(duì)象才能夠比較,實(shí)際上這里有第二個(gè)對(duì)象,那就是this,也就是這個(gè)可比較類
本身,這里相當(dāng)于this是第一個(gè)參數(shù),而o是第二個(gè)參數(shù),只是this不需要寫(xiě)出,因?yàn)檫@個(gè)方法就是
this自身的,從邏輯上來(lái)看相當(dāng)于this比較o,理解了這個(gè)就能夠理解下面的代碼了:

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;
    }
}


一般來(lái)講,Comparator使用的更多,因?yàn)槿绻粋€(gè)類實(shí)現(xiàn)了Comparable接口,那么一般來(lái)講它就具有了
一種不可變的比較方法,即使可以通過(guò)控制變量來(lái)使得compareTo這個(gè)方法具有可變性(比如使其從this比較o變成o比較this),但從面向?qū)ο蟮慕嵌葋?lái)看這也是不正確的,因?yàn)橐粋€(gè)對(duì)象一旦是可比較的,那么可比較的邏輯就應(yīng)該是確定的。不過(guò)Comparator則不同,可以隨時(shí)定制,隨時(shí)根據(jù)需求隨時(shí)更改,因?yàn)樗?strong>不是被可比較類實(shí)現(xiàn),因此即使更改也不破環(huán)可比較類的內(nèi)部比較邏輯!

最后說(shuō)一下,java8之后有了lambda表達(dá)式,使得代碼可以寫(xiě)成下面這樣,使得代碼簡(jiǎn)化了很多:

    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);

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/72863.html

相關(guān)文章

  • 如何實(shí)現(xiàn)Comparable,Comparator接口,重寫(xiě)compareTo,compare方法

    摘要:實(shí)體類接口重寫(xiě)方法,業(yè)務(wù)排序類接口重寫(xiě)方法這兩個(gè)接口我們非常的熟悉,但是在用的時(shí)候會(huì)有一些不知道怎么下手的感覺(jué),現(xiàn)在用案例進(jìn)行總結(jié),消除對(duì)這個(gè)知識(shí)點(diǎn)的理解盲區(qū)個(gè)人的理解,如果有錯(cuò)誤請(qǐng)多多指教。 實(shí)體類:java.lang.Comparable(接口) + comareTo(重寫(xiě)方法),業(yè)務(wù)排序類 java.util.Comparator(接口) + compare(重寫(xiě)方法). 這兩...

    liuchengxu 評(píng)論0 收藏0
  • java comparable comparator

    摘要:一內(nèi)部排序接口實(shí)現(xiàn)該接口的類,支持自然排序內(nèi)排序。方法與方法不一致。在有序集合看來(lái)和是相等的,因此第個(gè)鍵無(wú)法被添加到集合中。 一、Comparable(內(nèi)部排序接口) 實(shí)現(xiàn)該接口的類,支持自然排序(內(nèi)排序)。Arrays.sort(Object[])和Collection.sort(Object[])要求對(duì)象必須實(shí)現(xiàn)Comparable接口 文檔中指出: 如果該對(duì)象大于指定對(duì)象,返回...

    why_rookie 評(píng)論0 收藏0
  • Java? 教程(對(duì)象排序)

    對(duì)象排序 List l可以如下排序。 Collections.sort(l); 如果List包含String元素,它將按字母順序排序,如果它由Date元素組成,它將按時(shí)間順序排序,這是怎么發(fā)生的?String和Date都實(shí)現(xiàn)了Comparable接口,Comparable實(shí)現(xiàn)為類提供了自然的順序,允許該類的對(duì)象自動(dòng)排序,下表總結(jié)了一些實(shí)現(xiàn)Comparable的更重要的Java平臺(tái)類。 類 自然...

    Chao 評(píng)論0 收藏0
  • Comparable and Comparator

    摘要:中的一切類都是繼承于,在中實(shí)現(xiàn)了函數(shù)所以,其它所有的類也相當(dāng)于都實(shí)現(xiàn)了該函數(shù)。是比較和的大小。返回負(fù)數(shù),意味著比小返回零,意味著等于返回正數(shù),意味著大于。 Comparable Comparable 是排序接口。 Collection.sort() 和Arrays.sort()都支持可以排序?qū)崿F(xiàn)Comparable接口的類的對(duì)象的List列表(或數(shù)組) 換而言之, 如果數(shù)組或列表想支持...

    Barrior 評(píng)論0 收藏0
  • Java ComparatorComparable辨析

    摘要:與辨析聲明文章均為本人技術(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...

    wenhai.he 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<