Java中这两个常用于排序的接口我总是过一段时间就忘了,这次干脆写下来它们,并附上测试的一段例子。
两者区别
- 所属包不同:Comparable在java.lang中,而Comparator在java.util中。
- 用于比较的方法定义不同:
Comparable<T>
中为public int compareTo(T object)
,而Comparator<T>
中为public int compare(T object1, T object2)
- 使用的方法不同:使用Comparable时,往往使要比较的对象的类实现该接口,使得该类自身具有可比较的能力,再调用排序方法进行排序;而使用Comparator时,往往是将实现了Comparator的比较器实例与要进行排序的集合、数组等一起传入排序方法,排序对象的类本身与比较器并没有太直接的关系(当然,比较器的类型参数应该为要比较的对象的类)。
比较方法返回值
//compareTo:
obj1.compareTo(obj2);
/*
* 若返回正数,obj1 > obj2
* 若返回零,obj1 = obj2
* 若返回负数,obj1 < obj2
* 可以理解为返回值与 obj1 - obj2 的正负性相同
* /
//compare(T obj1, T obj2):
/*
* 若返回正数,obj1 > obj2
* 若返回零,obj1 = obj2
* 若返回负数,obj1 < obj2
* 可以理解为返回值与 obj1 - obj2 的正负性相同
* /
示例代码
package com.hupeiwei;
import java.util.*;
public class Main {
public static void main(String[] args) {
//用于通过Comparable接口排序的List对象(当然并不只是List可以)
List<Student> sortByNumber = new ArrayList<>();
//用于通过Comparator实例进行排序的数组(当然并不只是数组可以)
Student[] sortByName = new Student[]{new Student(1,"b"), new Student(2,"a")};
//排序,传入了比较器
Arrays.sort(sortByName,new MyComparator());
System.out.println("Sort by name :");
for( Student stu : sortByName) {
System.out.println(stu);
}
/* output: * Sort by name : * Name : a Number : 2 * Name : b Number : 1 */
//将刚才按照名字排好序的数组传入List对象
sortByNumber.addAll(Arrays.asList(sortByName));
//将刚才排序结果再次按照学号排序
Collections.sort(sortByNumber);
System.out.println("Sort by number :");
for( Student stu : sortByNumber) {
System.out.println(stu);
}
/* output: * Sort by number : * Name : b Number : 1 * Name : a Number : 2 */
}/*main*/
}/*Main*/
class Student implements Comparable<Student> {
private int number;
private String name;
Student(int number, String name) {
this.number = number;
this.name = name;
}
Student() {
this(-1,"");
}
int getNumber() {
return number;
}
String getName() {
return name;
}
public String toString() {
return "Name : " + getName() + " Number : " + getNumber();
}
//通过学号排序,无效学生放最前面
public int compareTo(Student stu) {
return number - stu.getNumber();
}
}
//该比较器通过name字典序排序,通过String中重写的compareTo方法
class MyComparator implements Comparator<Student> {
public int compare(Student stu1, Student stu2) {
return stu1.getName().compareTo(stu2.getName());
}
}