我们都知道,实现 Comparator
和 Comparable
这两个接口,可以实现对对象比较大小。那这两个又有什么区别呢?
comparator
1、接口类在 java.util
包里面,实现接口时需要导入该包。
2、一般新建一个类实现这个接口,用来比较其他对象的大小。实现这个接口时,对象不能把自己和其他对象相比较。
3、实现 publicintcompare(Objecto1,Objecto2)
,当实现类使用了泛型时, Object
可以换成具体的类型。
import java.util.Comparator; public class StudentComparator implements Comparator<Student> { @Override public int compare(Student o1, Student o2) { //在这里我们把age作为对象比较大小的依据 if (o1.getAge() > o2.getAge()) return 1; else if (o1.getAge()<o2.getAge()) return -1; return 0;//如果两个对象相等,返回0 } }
comparable
1、接口类在 java.lang
包里面,实现接口时无需导包。
2、一般是需要比较大小的类直接实现这个接口,因为实现这个接口时,支持自己直接和另一个对象比较大小。
3、实现 publicintcompareTo(Objecto)
方法,当实现类使用了泛型时,Object也可以换成具体的类型
public class Student implements Comparable<Student> { private String name; private int 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(Student student) { //在这里我们把age作为对象比较大小的依据 if (this.age > student.getAge()) return 1; else if (this.age<student.getAge()) return -1; return 0;//如果两个对象相等,返回0 } }
相同点
两者实现的函数的返回值一样,都是int类型的。当要对对象按照某个属性进行比较大小排序时,返回值不同,会影响排序的顺序。例如,如果按照年龄的大小对 Student
进行排序时,如果按照从小到大的顺序进行排序时, compareTo
的实现方法如下:
1、比较者大于被比较者(也就是 compareTo
方法里面的对象),那么返回正整数
2、比较者等于被比较者,那么返回0
3、比较者小于被比较者,那么返回负整数
如果按照从大到小的顺序进行排序时,只需把1和3中的返回值互换。
实现排序的主函数如下所示:
import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class Main { public static void main(String[] args) { Student s1 = new Student(); s1.setName("张三"); s1.setAge(18); Student s2 = new Student(); s2.setName("李四"); s2.setAge(19); Student s3 = new Student(); s3.setName("王五"); s3.setAge(22); List<Student> list = new ArrayList<Student>(); list.add(s2); list.add(s3); list.add(s1); Student[] students1 = new Student[list.size()];//数组的大小需要和集合的长度保持一致,如果数组过长,后面会被自动赋值null,排序时报空指针异常 list.toArray(students1);//集合转换成数组 list.sort(new StudentComparator());//集合排序 Arrays.sort(students1);//数组排序 for (Student student : list) { System.out.println(student.getName()); } } }