一个专用的比较器Comparator
Comparator是一个专用的比较器,当一个不支持自比较或者自比较函数不能满足要求时,可写一个比较器来完成两个对象之间大小的比较。Comparator体现了一种策略模式,即不改变对象自身,而用一个策略对象来改变它的行为。
import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;
class Student {
private String name;
private float score;
public Student(String name, float score) {
this.name = name;
this.score = score;
}
public String getName() {
return name;
}
public float getScore() {
return score;
}
@Override
public String toString() {
return String.valueOf(this.name + ": " + this.score);
}
}
class StudentComparator implements Comparator<Student> {
@Override
public int compare(Student o1, Student o2) {
if (o2.getScore() - o1.getScore() > 0) {
return 1;
} else if (o2.getScore() - o1.getScore() < 0) {
return -1;
} else {
return 0;
}
}
}
public class ComparableDemo {
public static void main(String[] args) {
TreeSet<Student> set = new TreeSet<Student>(new StudentComparator());
set.add(new Student("zhangsan", 79));
set.add(new Student("lisi", 95));
set.add(new Student("wangwu", 87));
for (Iterator<Student> iter = set.iterator(); iter.hasNext();) {
System.out.println(iter.next());
}
}
}
打印结果:
lisi: 95.0
wangwu: 87.0
zhangsan: 79.0
说明
Comparator接口有两个方法,一个是compare方法,另外一个是equals()方法,但是大多数情况下,在一个类实现Comparator接口时,是不需要重写equals方法的,这是因为这个类继承了Object的equals方法。
Comparable接口和Comparator接口的区别
- 它们两个都是用来实现集合中元素的比较、排序的。
- Comparable是在集合内部定义的方法实现的排序,位于java.util包下
- Comparator是在集合外部实现的排序,位于java.lang包下。
- 在一个又一个类设计完成后,或许我们最初没有考虑到类的比较问题,没有对Comparable接口进行实现,没有关系,我们可以通过Comparator接口来完成,并且无需改变之前完成的类的构建。