Java比较器的使用
在编程中我们常常需要对对象进行排序,而排序又必须根据对象的实际类型进行比较。Java中提供了两个比较器接口用于对象之间的比较,分别是java.lang包中的Comparable接口和java.util包中Comparator接口。下面分别对这两种使用方法进行简单介绍。
第一种java.lang.Comparable接口,只需要实现compareTo()一个方法就可以实现比较功能,并且调用系统排序函数查看效果。代码如下:
import java.util.Arrays;
public class Children implements Comparable<Children>{
private String name;
private int age;
public Children(String name,int age){
this.name=name;
this.age=age;
}
public String toString(){//重载toString()方法
return name+"******"+age;
}
@Override
public int compareTo(Children c) {
if(this.age>=c.age)
return 1;
else
return -1;
}
public static void main(String []args){
Children[] childrens={new Children("Helen",8),
new Children("David",12),
new Children("Andrew",10),
new Children("Angela",7),
new Children("Joe",9)};
Arrays.sort(childrens);
for(Children ch: childrens){
System.out.println(ch);
}
}
}
/* 输出结果
*Angela******7
*Helen******8
*Joe******9
*Andrew******10
*David******12
*/
采用这种方法,我们需要让比较的对象类实现这个接口,并且必须要重载int compareTo(Object o)方法,接受一个需要比较的同类型的对象,如果该对象小于参数返回负值,除此之外返回正值,这时排序以增序排列,反之则以降序排列。
第二种import java.util.Comparator接口,该接口有多个方法,但是如果是完成最简单的比较和排序的话,仅仅实现int compare(T o1, T o2)方法即可。代码如下:
import java.util.Arrays;
import java.util.Comparator;
public class Student {
private String name;
private int age;
public Student(String name,int age){
this.name=name;
this.age=age;
}
public String getName(){
return name;
}
public int getAge(){
return age;
}
public String toString(){
return name+"******"+age;
}
public static class CompareStudents implements Comparator<Student>{
@Override
public int compare(Student o1, Student o2) {
if (o1.getAge()>=o2.getAge())
return 1;
else
return -1;
}
}
public static void main(String []args){
Student[] students={new Student("Helen",8),
new Student("David",12),
new Student("Andrew",10),
new Student("Angela",7),
new Student("Joe",9)};
Arrays.sort(students,new CompareStudents());
for(Student stu: students){
System.out.println(stu);
}
}
}
/* 输出结果
*Angela******7
*Helen******8
*Joe******9
*Andrew******10
*David******12
*/
用这种方法,需要为比较的对象单独创建一个实现了Comparator接口的类,可以发现int compare(T o1, T o2)需要传入两个参数并且排序比较的规则与之前也是类似的。两种方法最后得到了完全一样的结果,但是Comparator接口还有很多其他方法,尤其是JDK1.8之后才添加的新的方法,所以会有更强大的功能。所以如果是仅仅实现基本的对象比较的话采用第一种就可以了,但是如果有更多需求的话,则需要采用第二种方法。
Tips:至于为什么需要重写toString()方法,是因为在System.out.println()中输出的如果是对象,则会默认调用其toString()方法,而所有的默认方法都是输出其对象名和地址。