1.介面Comparable<T> API 此介面強行對實現它的每個類的對象進行整體排序。這種排序被稱為類的自然排序,類的compareTo()方法被稱為它的自然比較方法。 實現此介面的對象列表(和數組)可以通過 Collections.sort(和 Arrays.sort)進行自動排序。實現此介面 ...
1.介面Comparable<T> API
- 參數類型:T ---可以與此對象進行比較的那些對象的類型
此介面強行對實現它的每個類的對象進行整體排序。這種排序被稱為類的自然排序,類的compareTo()方法被稱為它的自然比較方法。
實現此介面的對象列表(和數組)可以通過 Collections.sort
(和 Arrays.sort
)進行自動排序。實現此介面的對象可以用作有序映射中的鍵或有序集合中的元素,無需指定比較器。
Comparable也只有int compareTo(T object)一個方法。比較此對象與指定對象的順序。如果該對象小於、等於或大於指定對象,則分別返回負整數、零或正整數。
1 public class Person implements Comparable<Person> 2 { 3 String name; 4 int age; 5 public Person(String name, int age) 6 { 7 super(); 8 this.name = name; 9 this.age = age; 10 } 11 public String getName() 12 { 13 return name; 14 } 15 public int getAge() 16 { 17 return age; 18 } 19 @Override 20 public int compareTo(Person p) 21 { 22 return this.age-p.getAge(); 23 } 24 public static void main(String[] args) 25 { 26 Person[] people=new Person[]{new Person("wangwu", 18),new Person("zhaoliu", 19)}; 27 System.out.println("排序前"); 28 for (Person person : people) 29 { 30 System.out.print(person.getName()+":"+person.getAge()); 31 } 32 Arrays.sort(people);
33 System.out.println("\n排序後");
34 for (Person person : people) 35 { 36 System.out.print(person.getName()+":"+person.getAge()); 37 } 38 } 39 }
2.介面 Comparator<T> API
強行對某個對象 collection 進行整體排序 的比較函數。可以將 Comparator 傳遞給 sort 方法(如 Collections.sort
或 Arrays.sort
),從而允許在排序順序上實現精確控制。還可以使用 Comparator 來控制某些數據結構(如有序 set
或有序映射
)的順序,或者為那些沒有自然順序
的對象 collection 提供排序。
(1)int compare(T o1, T o2)
比較用來排序的兩個參數。根據第一個參數小於、等於或大於第二個參數分別返回負整數、零或正整數。
拋出異常:ClassCastException
- 如果參數的類型不允許此 Comparator 對它們進行比較。
(2)boolean equals(Object obj)
指示某個其他對象是否“等於”此 Comparator。此方法必須遵守 Object.equals(Object)
的常規協定。此外,僅當 指定的對象也是一個 Comparator,並且強行實施與此 Comparator 相同的排序時,此方法才返回 true。因此,comp1.equals(comp2)
意味著對於每個對象引用 o1 和 o2 而言,都存在 sgn(comp1.compare(o1, o2))==sgn(comp2.compare(o1, o2))。
註意,不 重寫 Object.equals(Object) 方法總是 安全的。然而,在某些情況下,重寫此方法可以允許程式確定兩個不同的 Comparator 是否強行實施了相同的排序,從而提高性能。
若一個類要實現Comparator 介面:它一定要實現compare(T o1, T o2) 函數,但可以不實現 equals(Object obj) 函數。
1 //定義一個比較器 2 public class PersonCompartor implements Comparator<Person> 3 { 4 @Override 5 public int compare(Person o1, Person o2) 6 { 7 return o1.getAge()-o2.getAge(); 8 } 9 } 10 11 public class Person 12 { 13 String name; 14 int age; 15 public Person(String name, int age) 16 { 17 super(); 18 this.name = name; 19 this.age = age; 20 } 21 public String getName() 22 { 23 return name; 24 } 25 public int getAge() 26 { 27 return age; 28 } 29 public static void main(String[] args) 30 { 31 Person[] people=new Person[]{new Person("xujian", 20),new Person("xiewei", 10)}; 32 System.out.println("排序前"); 33 for (Person person : people) 34 { 35 System.out.print(person.getName()+":"+person.getAge()); 36 }
//創建比較器參數PersonCompartor
37 Arrays.sort(people,new PersonCompartor());
38 System.out.println("\n排序後");
39 for (Person person : people) 40 { 41 System.out.print(person.getName()+":"+person.getAge()); 42 } 43 } 44 }
3.Comparator與Comparable比較
(1)Comparable 介面強行對實現它的每個類的對象進行整體排序。這種排序被稱為類的自然排序.
Comparable是 定義在 Person類的內部稱為“內部排序”,是一種簡單的方式,需要修改源代碼。
Arrays.sort(people);
(2)Comparator 是比較器,排序時,需要新建比較器對象,將比較器和對象一起傳遞過去就可以比大小,可稱為“外部排序”。
Comparator 是定義在Person的外部的, 此時我們的Person類的結構不需要有任何變化。並且在Comparator 裡面用戶可以自己實現複雜的可以通用的邏輯,使其可以匹配一些比較簡單的對象,那樣就可以節省很多重覆勞動了。
Arrays.sort(people,new PersonCompartor());
相關鏈接
Java中Comparable和Comparator區別小結