Comparable接口的實現和使用

1.什麼是Comparable接口java

  此接口強行對實現它的每一個類的對象進行總體排序。此排序被稱爲該類的天然排序 ,類的 compareTo 方法被稱爲它的天然比較方法 。實現此接口的對象列表(和數組)能夠經過 Collections.sort (和 Arrays.sort )進行自動排序。實現此接口的對象能夠用做有序映射表中的鍵或有序集合中的元素,無需指定比較器。 強烈推薦(雖然不是必需的)使天然排序與 equals 一致。所謂與equals一致是指對於類 的每個 e1 和 e2 來講,當且僅當 (e1.compareTo((Object)e2) == 0) e1.equals((Object)e2) 具備相同的布爾值時,類 的天然排序才叫作與 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 }
相關文章
相關標籤/搜索