Comparator 與 Comparable

 說道Comparator 與 Comparable接口,就不得不說一下Collections和Arrays這兩個類,他們分別爲集合和數組提供一些查找、排序的操作。那麼就以Collections爲例,它有一個sort(),方法可以試下集合元素的排序。比如一個集合 ArrayList<Integer>  arr,我們可以通過Collections.sort(arr),對其進行排序,那麼問題來了,Integer類型是數字自然可以進行排序,可是如果集合中的元素是一些我們自定義的對象怎麼辦呢???比如我們定義了一個Person類,ArrayList<Person> arr2,那麼顯然Collections.sort(arr2)是會報錯的,這時候怎麼辦呢,這就需要我們定義自己的比較器,Collection是中提供了另一個重載方法sort(Collection c,Comparater com)。

下面看例子:

package test;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

public class CompateTest {
  public static void main(String[]args){
	  Person1 p11 = new Person1("x1",12);
	  Person1 p12 = new Person1("x2",13);
	  Person1 p13 = new Person1("x3",11);
	  Person1 p14 = new Person1("x4",10);

	  ArrayList<Person1> l1 = new ArrayList<Person1>();
	   l1.add(p11);
	   l1.add(p12);
	   l1.add(p13);
	   l1.add(p14);
	
	 Collections.sort(l1,new Comparator<Person2>() {

		@Override
		public int compare(Person2 o1, Person2 o2) {
			// TODO Auto-generated method stub
			return o1.age - o2.age;
		}
		
	});
  }
}

class Person1{
	public String name;
	public int age;
	public Person2(String name,int age){
		this.name = name;
		this.age = age;
	}
	
}


上面的例子中我們編寫了自己的比較規則,那就是按年齡排序

這時候,有人說,這樣有點兒麻煩,我還是想用第一個sort()方法進行排序可以嗎???

當然可以,這個時候就用到了Comparable接口,我們可以讓Person實現Comparable接口,然後在Person內部定義自己的比較規則。

看例子

package test;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

public class CompateTest {
  public static void main(String[]args){
	 
	  Person2 p21 = new Person1("x1",12);
	  Person2 p22 = new Person1("x2",16);
	  Person2 p23 = new Person1("x3",13);
	  Person2 p24 = new Person1("x4",15);
	
	
	   ArrayList<Person2> l1 = new ArrayList<Person2>();
	   l1.add(p21);
	   l1.add(p22);
	   l1.add(p23);
	   l1.add(p24);
	 Collections.sort(l1);
	 
		
	});
  }
}
class Person2 implements Comparable<Person1>{
	public String name;
	public int age;
	public Person1(String name,int age){
		this.name = name;
		this.age = age;
	}
	@Override
	public int compareTo(Person1 o) {
		// TODO Auto-generated method stub
		return this.age - o.age;
	}
}

	
}

這樣實現了同樣的功能。


總結:Comparable 是在集合內部定義的方法實現的排序,Comparator 是在集合外部實現的排序,通俗講Comparable是給類賦予可比較性,而Comparator 是在外部定義了一個比較器,與類本身並無關聯。

如果不是調用sort方法,相要直接比較兩個對象的大小,如下:
Comparator定義了倆個方法,分別是   int   compare(T   o1,   T   o2)和   boolean   equals(Object   obj),
用於比較兩個Comparator是否相等
有時在實現Comparator接口時,並沒有實現equals方法,可程序並沒有報錯,原因是實現該接口的類也是Object類的子類,而Object類已經實現了equals方法
看例子

package test;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

public class CompateTest {
  public static void main(String[]args){
	
	  Person1 p21 = new Person1("x1",12);
	  Person1 p22 = new Person1("x2",16);
	   Comparator  c =   new Comparator<Person2>() {
		@Override
		public int compare(Person2 o1, Person2 o2) {
			// TODO Auto-generated method stub
			return o1.age - o2.age;
		}
	

	});
      int k = c.compare(p21,p22);
  }
}

class Person2{
	public String name;
	public int age;
	public Person2(String name,int age){
		this.name = name;
		this.age = age;
	}
	
}

 Comparable接口只提供了   int   compareTo(T   o)方法,也就是說假如我定義了一個Person類,這個類實現了   Comparable接口,那麼當我實例化Person類的person1後,我想比較person1和一個現有的Person對象person2的大小時,我就可以這樣來調用:person1.comparTo(person2),通過返回值就可以判斷了;

看例子

package test;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

public class CompateTest {
  public static void main(String[]args){
	  Person1 p11 = new Person1("x1",12);
	  Person1 p12 = new Person1("x2",13);
	  
	 p11.compareTo(p12)
  }
}
class Person1 implements Comparable<Person1>{
	public String name;
	public int age;
	public Person1(String name,int age){
		this.name = name;
		this.age = age;
	}
	@Override
	public int compareTo(Person1 o) {
		// TODO Auto-generated method stub
		return this.age - o.age;
	}
}

	
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章