1. 程式人生 > 實用技巧 >利用Comparable介面實現對物件陣列的排序

利用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()方法原始碼是這樣寫的:

  • intcompareTo(To)
    將此物件與指定的物件進行比較以進行排序。 返回一個負整數,零或正整數,因為該物件小於,等於或大於指定物件。

    實現程式必須確保sgn(x.compareTo(y)) == -sgn(y.compareTo(x))

    所有xy。 (這意味著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 }

結果:

注意:

  該介面對實現它的每個類的物件強加一個整體排序。 這個排序被稱為類的自然排序 ,類的compareTo方法被稱為其自然比較方法