1.什麼是Comparable接口java
此接口強行對實現它的每一個類的對象進行總體排序。此排序被稱爲該類的天然排序 ,類的 compareTo 方法被稱爲它的天然比較方法 。實現此接口的對象列表(和數組)能夠經過 Collections.sort (和 Arrays.sort )進行自動排序。實現此接口的對象能夠用做有序映射表中的鍵或有序集合中的元素,無需指定比較器。 強烈推薦(雖然不是必需的)使天然排序與 equals 一致。所謂與equals一致是指對於類 C 的每個 e1 和 e2 來講,當且僅當 (e1.compareTo((Object)e2) == 0) 與e1.equals((Object)e2) 具備相同的布爾值時,類 C 的天然排序才叫作與 equals 一致 。算法
2.實現什麼方法數組
int compareTo(T o) 比較此對象與指定對象的順序。若是該對象小於、等於或大於指定對象,則分別返回負整數、零或正整數。
強烈推薦 (x.compareTo(y)==0) == (x.equals(y)) 這種作法,但不是 嚴格要求這樣作。通常來講,任何實現 Comparable 接口和違背此條件的類都應該清楚地指出這一事實。
推薦如此闡述:「注意:此類具備與 equals 不一致的天然排序。」
參數:
o - 要比較的對象。
返回:
負整數、零或正整數,根據此對象是小於、等於仍是大於指定對象。
拋出:
ClassCastException - 若是指定對象的類型不容許它與此對象進行比較。
3.實例
1 import java.util.*; 2 3 public class EmployeeSortTest { 4 /** 5 * @param args 6 */ 7 public static void main(String[] args) { 8 // TODO Auto-generated method stub 9 Employee[] staff = new Employee[ 3 ]; 10 staff[ 0 ] = new Employee( "harry Hacker" , 35000 ); 11 staff[ 1 ] = new Employee( "carl cracke" , 75000 ); 12 staff[ 2 ] = new Employee( "tony Tester" , 38000 ); 13 Arrays.sort(staff); //sort方法能夠實現對對象數組排序,可是必須實現 Comparable接口 14 /*Comparable接口原型爲: 15 * public interface Comparable<T> 16 * { 17 * int compareTo(T other);//接口的中方法自動屬於public方法 18 * } 19 */ 20 for (Employee e: staff) 21 System.out.println( "id=" +e.getId()+ " name=" +e.getName()+ 22 ".salary=" +e.getSalary()); 23 } 24 } 25 /* 26 * 由於要實現對Employee對象的排序,因此在Employee類中要實現Comparable接口, 27 * 也就是要實現comepareTo()方法 28 */ 29 class Employee implements Comparable<Employee> 30 { 31 public Employee(String n, double s) 32 { 33 name = n; 34 salary = s; 35 Random ID = new Random(); 36 id = ID.nextInt( 10000000 ); 37 } 38 public int getId() 39 { 40 return id; 41 } 42 public String getName() 43 { 44 return name; 45 } 46 public double getSalary() 47 { 48 return salary; 49 } 50 public void raiseSalary( double byPercent) 51 { 52 double raise = salary *byPercent/ 100 ; 53 salary+=raise; 54 } 55 public int compareTo(Employee other) 56 { 57 if (id<other.id) //這裏比較的是什麼 sort方法實現的就是按照此比較的東西從小到大排列 58 return - 1 ; 59 if (id>other.id) 60 return 1 ; 61 return 0 ; 62 } 63 private int id; 64 private String name; 65 private double salary; 66 }
4.與Comparator的區別
Comparator位於包java.util下,而Comparable位於包java.lang下,
Comparable接口將比較代碼嵌入自身類中,然後者在一個獨立的類中實現比較。
若是類的設計師沒有考慮到Compare的問題而沒有實現Comparable接口,
能夠經過 Comparator來實現比較算法進行排序,而且爲了使用不一樣的排序標準作準備,好比:升序、降序。
咱們看一個Comparator的例子:
1 import java.util.TreeSet; 2 import java.util.Comparator; 3 class NumComparator implements Comparator<NameTag> { 4 public int compare (NameTag left,NameTag right) { 5 return(left.getNumber() - right.getNumber()); 6 } 7 } 8 public class CollectionNine { 9 public static void main(String arg[]) { 10 new CollectionNine(); 11 } 12 CollectionNine() { 13 NumComparator comparator = new NumComparator(); 14 TreeSet<NameTag> set = new TreeSet<NameTag>(comparator); 15 set.add(new NameTag("Agamemnon",300)); 16 set.add(new NameTag("Cato",400)); 17 set.add(new NameTag("Plato",100)); 18 set.add(new NameTag("Zeno",200)); 19 set.add(new NameTag("Archimedes",500)); 20 for(NameTag tag : set) 21 System.out.println(tag); 22 } 23 }