最近遇到Comparator和Comparable两种比较器,老是弄混,所以这里做个笔记记录一下。
Comparable据说称为内部比较器,Comparator称为外部比较器,为什么这么说呢?我的理解是,Comparator可以脱离所需比较的类,在另一个类中去实现,有点绕,接下来在代码中回演示,细细体会即可理解。他们可以对类进行比较,其实说白了,实际上也就是根据类中的某个字段来比较这两个类的大小。说是比较,其实更多的是排序,利用Collections.sort()和Arrays.sort()这两个工具类进行排序。
先看Coparable这个比较器:在java.lang这个包里面。只用一个compareTo(T o)方法:
他比较的是当前对象和传入的对象大小,如果当前对象大于,等于,小于传入的对象,则返回1,0,-1值;
================================================================================================
再看看Comparator这个比较器:他是在java.util包里面;里面的方法比较多,但是我们只关心compare(T o1,T o2)这个方法。
这个方法比较参数是两个相同类型的对象,并比较其大小,如果o1大于,等于,小于o2对象,则返回1,0,-1值;
================================================================================================
着了用代码测试一下,先定义一个类吧:
package com.Jevin.compare.demo1;
public class Person{
private String name;
private int age;
public Person(String name,int age){
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
这里先用Comparable先测试:
package com.Jevin.compare.demo1;
import java.util.Arrays;
public class Person implements Comparable{
private String name;
private int age;
public Person(String name,int age){
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public int compareTo(Person p) {
return p.getAge() - this.age;
}
public static void main(String[] args) {
Person[] people = new Person[] {new Person("Jevin1", 11), new Person("Jevin2", 5), new Person("Jevin1", 27)};
System.out.println("========排序前========");
for (Person person : people) {
System.out.print(person.getName() + ":" + person.getAge() + " ");
}
System.out.println();
Arrays.sort(people);
System.out.println("=====排序后=====");
for (Person person : people) {
System.out.print(person.getName() + ":" + person.getAge() + " ");
}
}
}
测试结果如下:
这里我们用的是Arrays.sort()测试的,用Collections.sort()测试也可以的,如下:
并且我们注意到结果是降序的,原因在这里:
如果这么写的话,就升序了:
================================================================================================以上是Comparable比较器,下面介绍Comparator比较器:
上面的第一个Person类不要动,保留着,添加一个以下这个比较器:
package com.Jevin.compare.demo1;
import java.util.Arrays;
import java.util.Comparator;
public class PersonComparator implements Comparator {
@Override
public int compare(Person p1, Person p2) {
return p1.getAge() - p2.getAge();
}
public static void main(String[] args){
Person[] people = new Person[]{new Person("Jevin1",11),new Person("Jevin2",5),new Person("Jevin1",27)};
System.out.println("========排序前========");
for(Person person:people){
System.out.print(person.getName()+":"+person.getAge()+" ");
}
System.out.println();
Arrays.sort(people,new PersonComparator());
System.out.println("=====排序后=====");
for(Person person:people){
System.out.print(person.getName()+":"+person.getAge()+" ");
}
}
}
这里和Comparable的区别看这里:
这里排序时将排序规则的对象加了进去,结果是升序,想要降序很简单,改一下compare()方法题即可:
================================================================================================
这里的Comparable和Comparator基本的用法就是这些了,以后需要用到的在写吧!