java中自然排序和比较器排序
這里所說到的Java中的排序并不是指插入排序、希爾排序、歸并排序等具體的排序算法。而是指執行這些排序算法時,比較兩個對象“大小”的比較操作。我們很容易理解整型的 i>j 這樣的比較方式,但當我們對多個對象進行排序時,如何比較兩個對象的“大小”呢?這樣的比較 stu1 > stu2 顯然是不可能通過編譯的。為了解決如何比較兩個對象大小的問題,JDK提供了兩個接口 java.lang.Comparable 和 java.util.Comparator 。
一、自然排序:java.lang.Comparable 
   Comparable 接口中只提供了一個方法: compareTo(Object obj) ,該方法的返回值是 int 。如果返回值為正數,則表示當前對象(調用該方法的對象)比 obj 對象“大”;反之“小”;如果為零的話,則表示兩對象相等。下面是一個實現了 Comparable 接口的 Student 類: 
Java代碼 收藏代碼 
 public class Student implements Comparable { 
}
Student 實現了自然排序接口 Comparable ,那么我們是怎么利用這個接口對一組 Student 對象進行排序的呢?我們在學習數組的時候,使用了一個類來給整型數組排序: java.util.Arrays 。我們使用 Arrays 的 sort 方法來給整型數組排序。翻翻 API 文檔就會發現, Arrays 里給出了 sort 方法很多重載形式,其中就包括 sort(Object[] obj) ,也就是說 Arryas 也能對對象數組進行排序,排序過程中比較兩個對象“大小”時使用的就是 Comparable 接口的 compareTo 方法。
Java代碼 收藏代碼 
 public class CompareTest { 
}
Student 數組里添加元素的順序并不是按學號 id 來添加的。調用了 Arrays.sort(stus) 之后,對 Student 數組進行排序,不管 sort 是使用哪種排序算法來實現的,比較兩個對象“大小”這個操作,它是肯定要做的。那么如何比較兩個對象的“大小”? Student 實現的 Comparable 接口就發揮作用了。 sort 方法會將待比較的那個對象強制類型轉換成 Comparable ,并調用 compareTo 方法,根據其返回值來判斷這兩個對象的“大小”。所以,在這個例子中排序后的原 Student 亂序數組就變成了按學號排序的 Student 數組。
但是我們注意到,排序算法和 Student 類綁定了, Student 只有一種排序算法。但現實社會不是這樣的,如果我們不想按學號排序怎么辦?假如,我們想按姓名來給學生排序怎么辦?我們只能修改 Student 類的 Comparable 接口的 compareTo 方法,改成按姓名排序。如果在同一個系統里有兩個操作,一個是按學號排序,另外一個是按姓名排序,這怎么辦?不可能在 Student 類體中寫兩個 compareTo 方法的實現。這么看來Comparable就有局限性了。為了彌補這個不足,JDK 還為我們提供了另外一個排序方式,也就是下面要說的比較器排序。
二、比較器排序:java.util.Comparator 
   上面我提到了,之所以提供比較器排序接口,是因為有時需要對同一對象進行多種不同方式的排序,這點自然排序 Comparable 不能實現。另外, Comparator 接口的一個好處是將比較排序算法和具體的實體類分離了。 
翻翻 API 會發現, Arrays.sort 還有種重載形式:sort(T[] a, Comparator
總結
以上是生活随笔為你收集整理的java中自然排序和比较器排序的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: Arraylist gossip
- 下一篇: python pyecharts
