天天看點

Comparable接口和Comparator接口差別

簡單寫下兩種排序方法: 

Comparable接口和Comparator接口,兩個都是用來實作集合中元素的比較、排序的,隻是兩個接口使用的方式有些差別: 

(1)、Comparable位于java.lang下。 

     接口中的方法有:   int   compareTo(Object obj) 

     Comparator位于java.util下 

     接口中的方法有兩個: 

     Int  compare(Object obj1,Object obj2) 

     Boolean equals(Object obj) 

     因為Comparable位于java.lang下顯然預設的是Comparable下的方法。 

(2)、Comparable是在集合内部定義的方法實作的排序 

     compareTo()方法是放在對象類裡面的, 

     在集合内部現實 compareTo()的方法。 

    Comparator是在集合外部實作的排序, 

    compare()是放在比較對象的類外面的 

    需要在集合外定義 compare()的方法,也就是再寫一個類,而且需要導入    java.util.Comparator類 

(3)、在集合中,Collections.sort();方法排序。 

     在數組中用 Arrays.sort();方法進行排序。 

(4)、自定義的類要加入List容器中後才能夠排序,如果不指定Comparator,那麼就實作 Comparable接口設定的排序方法即自然順序排序。 

(5)、Comparator是一個專用的比較器,當這個對象不支援自比較函數或者自比較函數不能滿足要求時,可以寫一個比較器來完成兩個對象之間大小的比較。 

(6)簡單說;Comparable接口是一個對象本身已經支援自比較所需要實作的接口。 

      Comparator是一個另寫一個外部類來實作的比較的接口。 

例如:Student類實作Comparable接口。按照先按照age 

進行排序,如果age相等時再按照name進行排序 

代碼如下: 

public int compareTo(Student stu) { 

RuleBasedCollator collator = (RuleBasedCollator) Collator.getInstance(Locale.CHINA); 

// 根據元素的年齡排序從低到高,年齡相同時按照姓名排序從低到高 

  if(this.age<stu.getAge()){ 

return -1; 

   else if(this.age>stu.getAge()){ 

return 1; 

else{ 

        return collator.compare(this.getName(), stu.getName());

   } 

在main函數中,用Collections.sort()方法實作排序。 

   static List<Student> arr=new ArrayList<Student>(); 

   Student stu1=new Student(1,"張一",23,"北京"); 

   Student stu2=new Student(2,"王二",26,"河南"); 

   Student stu3=new Student(3,"李三",24,"山東"); 

   Student stu4=new Student(4,"張四",25,"北京"); 

   arr.add(stu1); 

   arr.add(stu2); 

   arr.add(stu3); 

   arr.add(stu4); 

   Collections.sort(arr);