比较器
1、comparable
内部比较器(实现在自定义类中)
作用:可以自己指定规则判断对象之间的大小
Comparable接口强行对实现它的每个类的对象进行整体排序。
int compareTo(T o)比较此对象与指定对象的顺序。如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。
class Student implements Comparable<Student>{
private int ID;
private String name;
public Student(int iD) {
super();
ID = iD;
}
public Student(int iD, String name) {
super();
ID = iD;
this.name = name;
}
public int getID() {
return ID;
}
public void setID(int iD) {
ID = iD;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public int compareTo(Student stu) {
return this.name.length()-stu.name.length();
}
}
public class Comparable_test {
public static void main(String[] args) {
Student stu1 = new Student(1,"AA");
Student stu2 = new Student(2,"BB");
if(stu1.compareTo(stu2)>0){
System.out.println("stu1比stu2更大");
}else if(stu1.compareTo(stu2)==0){
System.out.println("stu1与stu2相等");
}else if(stu1.compareTo(stu2)<0){
System.out.println("stu1比stu2更小");
}
}
}
2、comparator
外部比较器(需要重新写类定义比较器):compare方法
Comparator强行对某个对象 collection 进行整体排序 的比较函数。
int compare(T o1, T o2)比较用来排序的两个参数。根据第一个参数小于、等于或大于第二个参数分别返回负整数、零或正整数。
class Teacher {
private int id;
public Teacher(int id) {
super();
this.id = id;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
class TeacherCompare implements Comparator<Teacher>{
@Override
public int compare(Teacher t1, Teacher t2) {
return t1.getId()-t2.getId();
}
}
public class Comparator_test {
public static void main(String[] args) {
Teacher t1 = new Teacher(2);
Teacher t2 = new Teacher(2);
TeacherCompare tc = new TeacherCompare();
int result = tc.compare(t1, t2);
System.out.println(result);
}
}
3、区别
(1)comparable接⼝实际上是出⾃java.lang包 它有⼀个 compareTo(Object obj) ⽅法⽤来排序
(2)comparator接⼝实际上是出⾃ java.util 包它有⼀个 compare(Object obj1, Object obj2) ⽅法⽤来排序
- ⼀般我们需要对⼀个集合使⽤⾃定义排序时,我们就要重写 compareTo() ⽅法或 compare() ⽅法,
- 当我们需要对某⼀个集合实现两种排序⽅式,⽐如⼀个song对象中的歌名和歌⼿名分别采⽤⼀种排序⽅法的话,我们可以重写 compareTo() ⽅法和使⽤⾃制的Comparator⽅法或者以两个Comparator来实现歌名排序和歌星名排序,第⼆种代表我们只能使⽤两个参数版的 Collections.sort() .