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;
	}
}

	
}



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