如果一个类的对象需要一个自然排序的功能,则需要实现Comparable接口,会实现Comparable接口的CompareTo()方法,在该方法中写出自然排序的规则,这样可以通过CompareTo()方法对,该类实现自然排序的功能。
如果一个需要排序的类,没有实现Comparable接口,但是又希望具有一个排序的功能,则可以在一个排序的类中实现Comparator接口。该接口中,需要实现一个Compare()方法,在该方法中写出自然排序的规则,这样可以通过Compare()方法,该类实现自然排序的功能。
- Comparable接口的CompareTo()方法需要传入一个参数,该参数是需要进行比较的对象。
- Comparator接口的Compare()方法需要传入两个参数,两个参数是需要进行比较的对象。
区别:Comparable是可进行比较的意思,是一个形容词,如果一个类需要比较的时候,则需要实现该接口;Comparator是比较者的意思,是一个名词,如果一个类没有实现Comparable接口,则可以在另一个类中,实现Comparator接口,让该类成为一个比较器,用来比较原来没有实现Comparable接口的类。
//使用Comparable接口,只需要使用一个类。
class Student implements Comparable<Student>{
private String name;
private int age;
private float score;
public Student(String name, int age, float score) {
this.name = name;
this.age = age;
this.score = score;
}
public String toString()
{
return name+"\t\t"+age+"\t\t"+score;
}
@Override
public int compareTo(Student o) {
// TODO Auto-generated method stub
if(this.score>o.score)//score是private的,为什么能够直接调用,这是因为在Student类内部
return -1;//由高到底排序
else if(this.score<o.score)
return 1;
else{
if(this.age>o.age)
return 1;//由底到高排序
else if(this.age<o.age)
return -1;
else
return 0;
}
}
}
public class ComparableDemo01 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Student stu[]={new Student("zhangsan",20,90.0f),new Student("lisi",22,90.0f),new Student("wangwu",20,99.0f),new Student("sunliu",22,100.0f)};
java.util.Arrays.sort(stu);
for(Student s:stu)
{
System.out.println(s);
}
}
}
运行结果:
sunliu 22 100.0
wangwu 20 99.0
zhangsan 20 90.0
lisi 22 90.0
//使用Comparator接口,需要使用两个类,一个是比较的类,一个是比较器。
class Student {
private String name;
private int age;
private float score;
public Student(String name, int age, float score) {
this.name = name;
this.age = age;
this.score = score;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public float getScore() {
return score;
}
public void setScore(float score) {
this.score = score;
}
public String toString()
{
return name+"\t\t"+age+"\t\t"+score;
}
}
//比较器
class StudentComparator implements Comparator<Student>{
@Override
public int compare(Student o1, Student o2) {
// TODO Auto-generated method stub
if(o1.getScore()>o2.getScore())
return -1;
else if(o1.getScore()<o2.getScore())
return 1;
else{
if(o1.getAge()>o2.getAge())
return 1;
else if(o1.getAge()<o2.getAge())
return -1;
else
return 0;
}
}
}
public class ComparableDemo02 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Student stu[]={new Student("zhangsan",20,90.0f),new Student("lisi",22,90.0f),new Student("wangwu",20,99.0f),new Student("sunliu",22,100.0f)};
java.util.Arrays.sort(stu,new StudentComparator());//利用比较器
for(Student s:stu)
{
System.out.println(s);
}
}
}
运行结果:
sunliu 22 100.0
wangwu 20 99.0
zhangsan 20 90.0
lisi 22 90.0
上述代码拷贝他人博客~