天天看點

利用Comparable接口實作對對象數組的排序

  Arrays 類中的sort方法承諾可以對對象數組進行排序,但是需要對象所屬的類實作Comparable接口

  任何實作Comparable接口的對象都需要實作該方法 并且在Java SE 5.0之前該方法的的參數必須是Object類型對象,傳回一個整形數值 。在Java SE 5.0之後Comparable接口已經改進為泛型類型。

1 public interface Comparable<T> {
2     public int compareTo(T o);
3 }      

對于compareTo()方法源碼是這樣寫的:

  • int compareTo(T o)      

    将此對象與指定的對象進行比較以進行排序。 傳回一個負整數,零或正整數,因為該對象小于,等于或大于指定對象。

    實作程式必須確定sgn(x.compareTo(y)) == -sgn(y.compareTo(x))所有x和y。 (這意味着x.compareTo(y)必須抛出異常iff y.compareTo(x)引發異常。)

    實施者還必須確定關系是可傳遞的: (x.compareTo(y)>0 && y.compareTo(z)>0)表示x.compareTo(z)>0 。

    最後,實施者必須確定x.compareTo(y)==0意味着sgn(x.compareTo(z)) == sgn(y.compareTo(z)) ,對于所有z 。

    強烈建議,但不要嚴格要求(x.compareTo(y)==0) == (x.equals(y)) 。 一般來說,任何實作Comparable接口并違反這種情況的類應清楚地表明這一點。 推薦的語言是“注意:此類具有與equals不一緻的自然排序”。

    在前面的描述中,符号sgn( ) 表達式表示數學符号函數,其定義根據表達式的值是否為負,零或正傳回的-1一個,0,或1。

    參數

    o

    - 要比較的對象。
    結果
    負整數,零或正整數,因為該對象小于,等于或大于指定對象。
    異常

    NullPointerException

    - 如果指定的對象為空

    ClassCastException

    - 如果指定的對象的類型阻止它與該對象進行比較。 

實作代碼:

1 package test;
 2 
 3 import java.util.Arrays;
 4 
 5 public class Employee implements Comparable<Employee> {
 6 
 7     int id;
 8 
 9     String name;
10 
11     double salary;
12 
13     public Employee() {
14     }
15 
16     public Employee(int id, String name, double salary) {
17         super();
18         this.id = id;
19         this.name = name;
20         this.salary = salary;
21     }
22 
23     public int getId() {
24         return id;
25     }
26 
27     public String getName() {
28         return this.name;
29     }
30 
31     public double getSalary() {
32         return salary;
33     }
34 
35     public void raiseSalary(double byPercent) {
36         double raise = salary * byPercent / 100;
37         salary += salary;
38 
39     }
40 
41     /*
42      * Arrays 類中的sort方法承諾可以對對象數組進行排序,但是需要對象所屬的類實作Comparable接口
43      *
44      * 任何實作Comparable接口的對象都需要實作該方法 并且該方法的的參數必須是Object類型對象,傳回一個整形數值
45      */
46     @Override
47     public int compareTo(Employee other) {
48 
49         /*
50          * this.salary < other.salsry 傳回 -1 
51          * this.salary = other.salsry 傳回 0 
52          * this.salary > other.salsry 傳回 1
53          */
54         return Double.compare(this.salary, other.salary);
55     }
56 
57     @Override
58     public String toString() {
59         return "Employee [id=" + id + ", name=" + name + ", salary=" + salary + "]";
60     }
61 
62     public static void main(String[] args) {
63         Employee[] staff = new Employee[3];
64 
65         staff[0] = new Employee(1, "qijian", 15000.0);
66         staff[1] = new Employee(2, "Herry", 13000.0);
67         staff[2] = new Employee(3, "Tom", 14000.0);
68 
69         Arrays.sort(staff);
70 
71         for (Employee e : staff) {
72             System.out.println(e.toString());
73         }
74 
75     }
76 
77 }      

結果:

利用Comparable接口實作對對象數組的排序

注意:

  該接口對實作它的每個類的對象強加一個整體排序。 這個排序被稱為類的自然排序 ,類的compareTo方法被稱為其自然比較方法 。