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 }
結果:
注意:
該接口對實作它的每個類的對象強加一個整體排序。 這個排序被稱為類的自然排序 ,類的compareTo方法被稱為其自然比較方法 。