您的位置:首页 > 其它

Comparator 与 Comparable

2015-12-09 17:09 465 查看
 说道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;
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: