问题描述:
用Comparator接口对下列四位同学的成绩做降
*序排序,如果成绩一样,那在成绩排序的基础上按照年龄由小到大排序。
解决:
首先了解什么是Comparator? -----比较器接口。
说明:
(01) 若一个类要实现Comparator接口:它一定要实现compareTo(T o1, T o2) 函数,但可以不实现 equals(Object obj) 函数。
为什么可以不实现 equals(Object obj) 函数呢? 因为任何类,默认都是已经实现了equals(Object obj)的。 Java中的一切类都是继承于java.lang.Object,在Object.java中实现了equals(Object obj)函数;所以,其它所有的类也相当于都实现了该函数。
(02) int compare(T o1, T o2) 是“比较o1和o2的大小”。返回“负数”,意味着“o1比o2小”;返回“零”,意味着“o1等于o2”;返回“正数”,意味着“o1大于o2”。
接下来我们用List存放实例对象:
List<Student> stu = new ArrayList<>();
stu.add(new Student("贾宝玉",14,85));
stu.add(new Student("林黛玉",13,90.5));
stu.add(new Student("史湘云",13,85));
stu.add(new Student("薛宝钗",15,91));
接下来,我们来看看如何编写代码:
stu.sort(new Comparator<Student>() {
//小->大排序:返回“负数”,意味着“o1比o2小”;返回“零”,意味着“o1等于o2”;返回“正数”,意味着“o1大于o2”。
//大->小排序:返回“负数”,意味着“o1比o2大”;返回“零”,意味着“o1等于o2”;返回“正数”,意味着“o1小于o2”。
@Override
public int compare(Student o1, Student o2) {
if(o1.getScore()>o2.getScore()) {
return -1;
} else if(o1.getScore()<o2.getScore()){
return 1;
} else if(o1.getScore()==o2.getScore()) {
if(o1.getAge()<o2.getAge()) {
return -1;
}
else
return 1;
}
return 0;
}
});
本题先按照成绩降序排序,(大->小排序:返回“负数”,意味着“o1比o2大”;返回“零”,意味着“o1等于o2”;返回“正数”,意味着“o1小于o2”。),按照这句话,先将成绩降序排序。
当遇到成绩一样时,我们需要再利用年龄进行升序排序,(小->大排序:返回“负数”,意味着“o1比o2小”;返回“零”,意味着“o1等于o2”;返回“正数”,意味着“o1大于o2”。)
查看输出:
for(Student s : stu) {
System.out.println(s);
}
总结一下,这种用Comparator 排序,第一步搞清楚要升序还是降序,第二步:
升序排序:返回“-1”,意味着“o1比o2小”;返回“0”,意味着“o1等于o2”;返回“1”,意味着“o1大于o2”。
降序排序:返回“-1”,意味着“o1比o2大”;返回“0”,意味着“o1等于o2”;返回“0”,意味着“o1小于o2”。
这样就能记住啦!
思考Comparable 。
Comparator 和 Comparable 比较:
Comparable是排序接口;若一个类实现了Comparable接口,就意味着“该类支持排序”。而Comparator是比较器;我们若需要控制某个类的次序,可以建立一个“该类的比较器”来进行排序。
Comparable相当于“内部比较器”,而Comparator相当于“外部比较器”。