日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

Java中关于Arrays.sort的两种重载方法的理解

發(fā)布時間:2024/4/11 java 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java中关于Arrays.sort的两种重载方法的理解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前言

在java中重載排序方法的方法目前有兩種,一種是實現(xiàn)Comparable接口的compareTo方法,還有一種是用比較器(comparator) 作為參數(shù),其中比較器是實現(xiàn)了Comparator接口的類的實例

類比于C++來看,重載排序方法實質(zhì)上就是重載類的小于號,但是java標準中沒有規(guī)定可以重載運算符,所以需要用接口實現(xiàn)這個過程

同樣是類比C++,上述的兩種方法分別對應(yīng)著重載小于號的函數(shù)作為成員函數(shù)友元函數(shù)的區(qū)別,而其各自的優(yōu)點分別是:

  • 覆蓋compareTo函數(shù):可以用于比較父子類之間的大小關(guān)系
  • 比較器比較:更好理解,實現(xiàn)也更簡單
  • 關(guān)于這兩種比較方法的語法網(wǎng)上一搜一大堆,我也就不多說了,重點是想記錄一下個人的一些理解

    1.實現(xiàn)Comparable接口的compareTo方法

    class Node implements Comparable<Node> {private int x,y;@overridepublic int compareTo(Node t){if(x!=t.x) return x-t.x;return y-t.y;} }

    先放上代碼,Node類只有兩個字段,排序方法首先以 x 進行排序,如果 x 相等的話再以 y 進行排序,下面是一些問題:


  • 為什么要實現(xiàn)Comparable接口的compareTo的方法,而不是直接在類內(nèi)提供一個compareTo的方法?
  • 答:主要原因在于Java是一種強類型語言,在調(diào)用方法的時候,編譯器要能檢查這個方法確實存在,而在sort內(nèi)部會出現(xiàn)這種語句:

    // approach used in the standard library -- not recommended if(((Comparable) a[i]).compareTo(a[j]) > 0) {// rearrange a[i] and a[j]... } //call in main Arrays.sort(a);

    其中Arrays.sort的參數(shù)是Object[]類型,在內(nèi)部進行比較的過程中,會將元素強制轉(zhuǎn)換為Comparable接口類型,然后調(diào)用其compareTo方法,所以需要對相應(yīng)元素的類內(nèi)實現(xiàn)Comparable接口的compareTo方法


  • 為什么不直接在Object類中定義compareTo方法,然后讓有需要的子類自己覆蓋呢?
  • 答:因為能用到compareTo的地方實際上非常少,在Object類中預(yù)留方法會非常浪費


  • 為什么不將Arrays.sort的形式參數(shù)設(shè)置為Comparable[]類型,這樣如果沒有實現(xiàn)Comparable接口的話就會自動報錯
  • 答:實際上上述方法理論上是可行的,但現(xiàn)實中為了讓接口統(tǒng)一標準,且許多類的內(nèi)都用到了Object對象,所以用Object[]作為參數(shù)顯然更符合通用型的習(xí)慣


  • 能不能在類內(nèi)提供compareTo方法,然后在Arrays.sort的參數(shù)表中提供元素的實例進行強制轉(zhuǎn)換呢?
  • 答:理論上是可行的,但代碼實現(xiàn)復(fù)雜度遠大于實現(xiàn)Comparable接口。提供元素的實例無非是為了強制轉(zhuǎn)換,但考慮到這種重載排序的方法有一個很大的優(yōu)點是可以對同一父類的任意子類比較大小,其原理用到了對象引用的多態(tài)性,這里不多贅述(懂的都懂)所以如果想要顯式強制轉(zhuǎn)換的話,對同一類型的排序會方便很多;但是對于不同類型的排序,就會顯得有點笨拙了。


    2.用比較器作為參數(shù)

    class cmp implements Comparator<Node> {public int compare(Node a,Node b){if(a.x!=b.x) return a.x-b.x;return a.y-b.y;} } //call in main Arrays.sort(a,new cmp());

    這種重載排序的方法是為了給那些在類內(nèi)沒有實現(xiàn)Comparable接口,但又想實現(xiàn)自定義排序的情況下準備的。
    不過這種方法比較簡單,沒什么好說的。結(jié)合后續(xù)lambda表達式以及函數(shù)式接口的知識,不難發(fā)現(xiàn)這種方法傳遞的Comparator接口實例完全可以用lambda表達式的一句話代替,寫起來可讀性強,而且代碼復(fù)雜度低

    平時算法競賽中的重載排序應(yīng)該都會選擇這種方法,無非就是好寫,如下所示

    //call in main Arrays.sort(t,(Node a,Node b)-> {if(a.x!=b.x) return a.x-b.x;return a.y-b.y; });

    后記

    因為在學(xué)習(xí)重載排序時遇到了一些底層的小問題,在請教過zx學(xué)長以及啃博客之后才稍微理清楚了其原理,所以寫博客記錄一下,如有錯誤歡迎指正

    總結(jié)

    以上是生活随笔為你收集整理的Java中关于Arrays.sort的两种重载方法的理解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。