Comparable和Comparator
Comparable接口
若一个类实现了Comparable接口,就意味着该类支持排序。实现了Comparable接口的类的对象的列表或数组可以通过Collections.sort或Arrays.sort进行自动排序。TreeSet集合想要实现自定义对象的排序必须实现Comparable接口。
实现此接口必须实现int compareTo(Object o)方法,返回负数、零、正数分别对应this大于、等于、小于o。
Comparable接口使用的代码演示
先定义一个类,实现Comparable接口
public class Teacher implements Comparable<Teacher>{//注意传入元素的泛型
int id;
String name;
public Teacher(){}
public Teacher(int id,String name){
this.id = id;
this.name = name;
}
//重写toString()方法
public String toString(){
return id + ":" + name;
}
@Override
public int compareTo(Teacher o) {
//this比o小,负数/this比o大,正数/this等于o,零
return this.id - o.id;
}
}
测试类代码如下:
public class Test {
public static void main(String[] args){
//定义一个ArrayList集合
ArrayList<Teacher> arr = new ArrayList<>();
Teacher t1 = new Teacher(2, "Jack");
Teacher t2 = new Teacher(1, "Rose");
Teacher t3 = new Teacher(3, "Sam");
arr.add(t1);
arr.add(t2);
arr.add(t3);
System.out.println(arr);
//通过Collections.sort()方法,传入支持排序的对象组成的数组。
Collections.sort(arr);
System.out.println(arr);
}
}
Comparator接口
若一个类没有实现Comparable接口,即不支持排序,我们可以自定义一个"比较器类",让其实现Comparator接口,通过"比较器类"实现排序。
实现此接口必须实现compare(Object o1,Object o2)方法,o1大于、小于、等于o2分别返回正数、负数、零。
Comparator接口使用的代码演示
新建一个Teacher类,代码如下:
public class Teacher{
int id;
String name;
public Teacher(){}
public Teacher(int id,String name){
this.id = id;
this.name = name;
}
//重写toString()方法
public String toString(){
return id + ":" + name;
}
}
新建一个"比较器类",实现Comparator接口,注意要传入要比较的元素的泛型类型,一定要实现compare()方法。
public class TeacherComparator implements Comparator<Teacher> {//注意传入元素的泛型
@Override
public int compare(Teacher o1, Teacher o2) {
//o1 < o2,负数/ o1 > o2,正数/o1 = o2,零
return o1.id - o2.id;
}
}
程序入口,测试代码如下:
public static void main(String[] args){
//定义一个ArrayList集合
ArrayList<Teacher> arr = new ArrayList<>();
Teacher t1 = new Teacher(2, "Jack");
Teacher t2 = new Teacher(1, "Rose");
Teacher t3 = new Teacher(3, "Sam");
arr.add(t1);
arr.add(t2);
arr.add(t3);
System.out.println(arr);
//集合对象调用sort()方法,传入TeacherComparator对象
arr.sort(new TeacherComparator());
System.out.println(arr);
}
运行结果如下:
[2:Jack, 1:Rose, 3:Sam]
[1:Rose, 2:Jack, 3:Sam]
Comparator和Comparable的区别
总的来说,
Comparable实现排序,通过要比较的对象元素实现接口,而Comparator实现排序,通过自定义"比较器类"实现接口。
一个是内部实现,一个是通过外部实现。
调用的方法、传递的参数也不同,
通过Comparable实现排序,一般要传入数组或集合对象。而通过Comparator实现排序,一般要传递比较器对象。
浙公网安备 33010602011771号