内部比较器:带比较类继承Comparable接口重写compareTo()方法;
Comparable
Comparable可以认为是一个内比较器,实现了Comparable接口的类有一个特点,就是这些类是可以和自己比较的,至于具体和另一个实现了Comparable接口的类如何比较,则依赖compareTo方法的实现,compareTo方法也被称为自然比较方法。如果开发者add进入一个Collection的对象想要Collections的sort方法帮你自动进行排序的话,那么这个对象必须实现Comparable接口。compareTo方法的返回值是int,有三种情况:
1、比较者大于被比较者(也就是compareTo方法里面的对象),那么返回正整数
2、比较者等于被比较者,那么返回0
3、比较者小于被比较者,那么返回负整数
外部比较器:新建一个继承comparator接口的比较器类,类中实现compare()方法。
Comparator
Comparator可以认为是是一个外比较器,个人认为有两种情况可以使用实现Comparator接口的方式:
1、一个对象不支持自己和自己比较(没有实现Comparable接口),但是又想对两个对象进行比较
2、一个对象实现了Comparable接口,但是开发者认为compareTo方法中的比较方式并不是自己想要的那种比较方式
Comparator接口里面有一个compare方法,方法有两个参数T o1和T o2,是泛型的表示方式,分别表示待比较的两个对象,方法返回值和Comparable接口一样是int,有三种情况:
1、o1大于o2,返回正整数
2、o1等于o2,返回0
3、o1小于o3,返回负整数
//主测试类
package comparableTwo;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class TestMain {
public static voidmain(String[] args) {
List<Student>list = new ArrayList<Student>(10);
list.add(newStudent(1,"a"));
list.add(newStudent(4,"s"));
list.add(newStudent(2,"c"));
list.add(newStudent(5,"b"));
Collections.sort(list);//内部比较器
System.out.println(list);
// TODO 自动生成的方法存根
List<Teacher>t = new ArrayList<Teacher>(10);
t.add(newTeacher(1,12));
t.add(newTeacher(4,13));
t.add(newTeacher(2,14));
t.add(newTeacher(1,15));
Teacher t1 = newTeacher(5,17);
Teacher t2 = newTeacher(8,2);
Collections.sort(t,newTeacherComparator());//外部比较器
System.out.println(t);
}
}
//packagecomparableTwo;
class Student implements Comparable{
int num;
String name;
public Student(int n,String nam){
num = n;
name = nam;
}
public StringtoString(){
return "\r\tnum:" + num +"\r\t"+name+"\r";
}
public intcompareTo(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;
}
}
public class Teacher {
private int num;
private double salary;
public Teacher(int num, double salary){
this.num = num;
this.salary = salary;
}
public double getSalary(){
return this.salary;
}
public StringtoString(){
return "\r\tnum:"+num+"salary:"+salary+"\r";
}
}
importjava.util.Comparator;
public classTeacherComparator implements Comparator {
@Override
public int compare(Object o1, Object o2) {
// TODO自动生成的方法存根
Teacher t1 = (Teacher)o1;
Teacher t2 = (Teacher)o2;
if(t1.getSalary()< t2.getSalary()){
return 1;
}
else if(t1.getSalary()> t2.getSalary()){
return -1;
}
return 0;
}
}
运行结果:
[
num:5name:b
,
num:4name:s
,
num:2name:c
,
num:1name:a
]
[
num:1 salary:15.0
,
num:2 salary:14.0
,
num:4 salary:13.0
,
num:1 salary:12.0
]
想要按从大到小排时候objec1 < object2 ,return 1;