1、Comparator 和 Comparable 的区别
Comparator 和 Comparable都是java的接口,用来比较自定义的class
Comparator(外部比较器)
覆写compare()方法
Pserson类:
public class Person{}
定义一个比较器类:
public PersonComparator implements Comparator {}
把要排列的Person保存在List类集或数组当中当中
Pserson[] arr={pserson1,new pserson2,new pserson3};
List list=new ArrayList();
list.add(pserson1);
list.add(pserson2);
list.add(pserson3);
调用sort方法有两种方式:
Collections.sort( list, new PersonComparator() )
Array.sort(arr, new PersonComparator())
此时list或arr中的元素已经排列完成,直接输出arr或list即可
Comparable(内部比较器)
覆写compareTo()方法
Comparable 实现在 Person类的内部:
调用sort,这里的参数只有一个
Collections.sort(List)
2、对比较器实现原理的理解
比较器的解释
compare()方法和compareTo()方法的返回值都为int,有三种
>0: 当前对象大于参数对象;
<0: 当前对象小于参数对象;
=0: 两者相等;
分析:由大到小的排列规则
如:假设x为当前对象,y为参数对象
if(x>y){
return -1;
}else if(x<y){
return 1;
}else{
return 0;
}
当x=3,y=5
将得到返回值1,表示x>y,即x=大 而 y=小
排列结果(小→大)即y,x=5,3
当x=5,y=3
将得到返回值-1,表示x<y,即x=小 而 x=大
排列结果(小→大)即x,y=5,3
分析由小到大的排列规则
如:假设x为当前对象,y为参数对象
if(x>y){
return 1;
}else if(x<y){
return -1;
}else{
return 0;
}
当x=3,y=5
将得到返回值-1,表示x<y,即x=小 而 x=大
排列结果(小→大)即x,y=3,5
当x=5,y=3
将得到返回值1,表示x>y,即x=大 而 y=小
排列结果(小→大)即y,x=3,5
比较两种规则
由小到大的排列规则
if(x>y){
return 1;
}else if(x<y){
return -1;
}else{
return 0;
}
由大到小的排列规则
if(x>y){
return -1;
}else if(x<y){
return 1;
}else{
return 0;
}
3、演示
主方法
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class CompareTest {
public static void main(String[] args) {
List<Student> list = new ArrayList<Student>(10);
list.add(new Student(1,"jj"));
list.add(new Student(0,"ww"));
list.add(new Student(0,"kk"));
list.add(new Student(2,"ll"));
Collections.sort(list); // 内部比较器:要排序的类实现Comparable接口,可以对自身进行比较
System.out.println(list);
List<Teacher> t = new ArrayList<Teacher>(10);
t.add(new Teacher(1,12));
t.add(new Teacher(0,13));
t.add(new Teacher(0,14));
t.add(new Teacher(2,15));
Collections.sort(t,new StudentComparator()); //外部比较器:通过额外的类来实现Comparator接口
System.out.println(t);
}
}
Comparable
class Student implements Comparable {
int num;
String name;
public Student(int num, String name) {
this.num = num;
this.name = name;
}
@Override
public String toString() {
return "\r\tnum:"+num+" name:"+name+"\r";
}
public int compareTo(Object o) {
Student tmp = (Student) o;
int result = tmp.num > num ? 1 : (tmp.num==num ? 0 : -1);
if (result == 0) {
result = tmp.name.indexOf(0) > name.indexOf(0) ? 1 : -1;
}
return result;
}
}
Comparator
class Teacher{
int num;
double salary;
public Teacher(int num, double salary) {
this.num = num;
this.salary = salary;
}
@Override
public String toString() {
return "\r\tnum:"+num+" salary:"+salary+"\r";
}
}
class StudentComparator implements Comparator{
public int compare(Object o1, Object o2) {
Teacher t1 = (Teacher) o1;
Teacher t2 = (Teacher) o2;
int result = t1.num > t2.num ? 1 : (t1.num == t2.num ? 0 : -1);
return result = result == 0 ?(t1.salary<t2.salary ? 1 : -1) : result;
}
}