java.lang.Comparable 介面

來源:互聯網
上載者:User

java.lang.Comparable 介面

轉自http://blog.csdn.net/zccst/article/details/5092920

 

java.lang.Comparable 介面定義的 compareTo() 方法用於提供對其實作類別的對象進行整體排序所需要的比較邏輯。

實作類別基於 compareTo() 方法的排序被稱為自然排序。而 compareTo() 方法的排序被稱為它的自然排序。具體的排序原則可由實作類別根據需要而定。使用者在重寫 compareTo() 方法以定製比較邏輯時,需要確保其餘等價性判斷方法 equals() 保持一致,即 e1.equals((Object)e2) 和 e1.compareTo((Object)e2)==0 具有相同的值,這樣的話我們就稱自然順序就和 equals 一致。

這個介面有什麼用呢?

如果一個數組中的對象實現了 Compareable 介面,則對這個數組進行排序非常簡單: Arrays.sort(); 如果 List 實現了該介面的話 , 我們就可以調用 Collections.sort 或者 Arrays 方法給他們排序。實際上 Java 平台庫中的所有值類 (value classes) 都實現了 Compareable 介面。

Comparable 介面只有一個方法 compareTo(Object obj)

其中

this < obj   返回負

this = obj   返回 0

this > obj   返回正

即將當前這個對象與指定的對象進行順序比較,當該對象小於、等於或大於指定對象時,分別返回一個負整數、0 或正整數,如果無法進行比較,則拋出 ClassCastException 異常。

 

其實,有兩種方式可以進行集合排序 :

   1. 集合中對象的所屬類實現了 java.lang.Comparable 介面

   2. 為集合指定比較子 java.lang.Comparator 的實作類別

Comparator , Comparable 介面的區別是:

comparable 是通用的介面,使用者可以實現它來完成自己特定的比較,而 comparator 可以看成一種演算法的實現,在需要容器集合 collection 需要比較功能的時候,來指定這個比較子,這可以看出一種設計模式,將演算法和資料分離,就像 C++ STL 中的函數對象一樣。

前者應該比較固定,和一個具體類相綁定,而後者比較靈活,它可以被用於各個需要比較功能的類使用。可以說前者屬於“靜態繫結”,而後者可以“動態綁定”。

一個類實現了 Camparable 介面表明這個類的對象之間是可以相互比較的。如果用數學語言描述的話就是這個類的對象組成的集合中存在一個全序。這樣,這個類對象組成的集合就可以使用 Sort 方法排序了。

而 Comparator 的作用有兩個:

1. 如果類的設計師沒有考慮到 Compare 的問題而沒有實現 Comparable 介面,可以通過  Comparator 來實現比較演算法進行排序

2. 為了使用不同的排序標準做準備,比如:升序、降序或其他什麼序

 

 

例如: Person.java 、 TestComparable.java

(1) Person.java

public class Person implements java.lang.Comparable{       private final int id;       private String name;       private int age;             public Person(int id,String name,int age){              this.id = id;              this.name = name;              this.age = age;       }       public int getId(){              return id;       }       public void setName(String name){              this.name = name;       }       public String getName(){              return name;         }       public void setAge(int age){              this.age = age;       }       public int getAge(){              return age;            }       public String toString(){              return "Id: " + id + "/tName: " + name + "/tAge: " + age;       }           @Override       public int compareTo(Object o){      // 實現 Comparable 介面的抽象方法,定義定序              Person p = (Person)o;              return this.id - p.id;                      // 升序排列,反之降序       }       @Override       public boolean equals(Object o){     //equals              boolean flag = false;              if(o instanceof Person){                     if(this.id == ((Person)o).id)                            flag = true;              }              return false;                 }    }

(2) TestComparable.java

import java.util.TreeSet;import java.util.Iterator; public class TestComparable{       public static void main(String[] args) {              TreeSet ts = new TreeSet();              ts.add(new Person(1003," 張三 ",15));              /**在new 第二個對象的時候已經開始排序了,回調用Person類的compareTo(Object o)方法*/              ts.add(new Person(1008," 李四 ",25));              ts.add(new Person(1015," 王五 ",73));              ts.add(new Person(1001," 趙六 ",49));               Iterator it = ts.iterator();              while(it.hasNext()){                     Person employee = (Person)it.next();                     System.out.println(employee);                   }       }}

運行結果:

Id: 1001   Name: 趙六   Age: 49

Id: 1003   Name: 張三   Age: 15

Id: 1008   Name: 李四   Age: 25

Id: 1015   Name: 王五   Age: 73

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.