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