高血压专题网,内容丰富有趣,生活中的好帮手!
高血压专题网 > 用Comparator接口进行排序 --java

用Comparator接口进行排序 --java

时间:2022-12-31 12:59:31

相关推荐

用Comparator接口进行排序 --java

问题描述:

用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”。@Overridepublic 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;}elsereturn 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相当于“外部比较器”。

参考这篇文章

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。