程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> Comparable和Comparator的區別

Comparable和Comparator的區別

編輯:C++入門知識

Comparable和Comparator的區別


 

 

Comparable和Comparator都是用來實現集合中元素的比較、排序的,只是Comparable 是在集合內部定義的方法實現的排序,Comparator 是在集合外部實現的排序,所以,如想實現排序,就需要在集合外定義 Comparator 接口的方法或在集合內實現 Comparable 接口的方法。

Comparator位於包java.util下,而Comparable位於包 java.lang下.

Comparable 是一個對象本身就已經支持自比較所需要實現的接口(如 String、Integer 自己就可以完成比較大小操作,已經實現了Comparable接口)

自定義的類要在加入list容器中後能夠排序,可以實現Comparable接口,在用Collections類的sort方法排序時,如果不指定Comparator,那麼就以自然順序排序,如API所說:

Sorts the specified list into ascending order, according to the natural ordering of its elements. All elements in the list must implement the Comparable interface

這裡的自然順序就是實現Comparable接口設定的排序方式。

而 Comparator 是一個專用的比較器,當這個對象不支持自比較或者自比較函數不能滿足你的要求時,你可以寫一個比較器來完成兩個對象之間大小的比較。

可以說一個是自已完成比較,一個是外部程序實現比較的差別而已。

用 Comparator 是策略模式(strategy design pattern),就是不改變對象自身,而用一個策略對象(strategy object)來改變它的行為。

Comparable interface

例如我們定義一個類Country,我們希望他的對象有大小關系,且依據countryId來排序的,所以我們讓Country實現Comparable接口,使其具備大小關系的能力,代碼如下:

class Country implements Comparable{
    private int countryId ;
    @Override
    public int compareTo(Object o) {
        Country country = (Country)o ;
        return this.getCountryId()>country.getCountryId()?1:this.getCountryId()==
                country.getCountryId()?0:-1 ;
    }
}

此時Country就具備了比較的能力了,如同Integer,String類一樣,此時Country對象的集合就可以通過Collections.sort(),或者Arrays.sort(),來進行排序了。

下面我們來看看Comparator使如何實現的。

Comparator interface

就像我們之前說的一樣,Comparator其實就好像一個工具,它不是使得Country具有排序性,而是他不改變Country類本身,而是單獨實現一個排序工具,來提供給Country用,下面我們就來實現這個排序工具類。

class Country{
    private int id ;
    public Country(int id){
        this.id = id ;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
}
class CountryByIdComparator implements Comparator{
    @Override
    public int compare(Country o1, Country o2) {
        return o1.getId()>o2.getId()?1:o1.getId()==o2.getId()?0:-1 ;
    }
}

大家注意到沒,單單看Country類,其實並沒有跟比較有任何關系,但是它卻能通過實現Comparator借口的工具類ContryByIdComparator來實現自動排序。此時調用的Collections.sort()就需要兩個參數了,一個是集合,一個是實現Comparator接口的工具類。

我們也可以利用匿名內部類來實現,而不需要單獨定義ContryByIdComparator這樣一個工具類,代碼如下:

Collections.sort(cityList,new Comparator(){
            @Override
            public int compare(City o1, City o2) {
                return o1.getId()>o2.getId()?1:o1.getId()==o2.getId()?0:-1 ;
            }

        }) ;

Comparator 是策略模式(strategy design pattern),就是不改變對象自身,而用一個策略對象(strategy object)來改變它的行為。

下面這張圖就是它們兩的區別:

image

Refference

  1. Comparable與Comparator的區別Difference between Comparator and Comparable in Java

    2014-11-16 17:27:25

    Brave,Happy,Thanksgiving !

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved