黑马程序员技术交流社区
标题:
创建自定义的Comparator比较器的设计思路
[打印本页]
作者:
杨浩
时间:
2013-1-28 01:03
标题:
创建自定义的Comparator比较器的设计思路
本帖最后由 杨浩 于 2013-1-28 16:36 编辑
如果要创建自定义的Comparator比较器,那么内部的比较代码怎么设计合理呢?
@Override
public int compare(Object o1, Object o2) {
}
复制代码
为了让他们具备自动排序的能力,那么是不是简单的加减其实就可以了?
比如让传入的学生对象,可以按照成绩排序,那么只要让学生的成绩相减然后返回,这样可以么?
因为有可能学生成绩相等的,那么有没有必要再加入名称的排序
得到的效果就是:如果成绩相等,就按照姓名排序!
作者:
黑马张英涛
时间:
2013-1-28 10:13
本帖最后由 黑马张英涛 于 2013-1-28 10:15 编辑
相减是可以的。两个元素比较只有大于、小于、等于三种关系。而在compare方法里则是通过分别返回
正数、负数、0来表示这种关系。用相减的方法能表现出这种关系,但是条件是比较的元素必须支持减法操作。
一个简单的例子:
public class MyTest {
/**
*
* @param args
*/
public static void main(String[] args) {
Student s1=new Student("abc",77);
Student s2=new Student("bdc",65);
Student s3=new Student("abe",65);
Student s4=new Student("cac",90);
List<Student> list=new ArrayList<Student>();
list.add(s1);
list.add(s2);
list.add(s3);
list.add(s4);
for(Student s : list){
System.out.println(s.name+":"+s.score);
}
System.out.println("=============================");
Collections.sort(list, new MyComparator()); //按照比较器指定的方式排序
for(Student s : list){
System.out.println(s.name+":"+s.score);
}
}
}
class Student {
public String name;
public int score;
public Student(String name,int score){
this.name=name;
this.score=score;
}
}
class MyComparator implements Comparator<Student>{
@Override
public int compare(Student o1, Student o2) {
if(o1.score==o2.score) //如果分数相等就按照名字比较的反序
return -o1.name.compareTo(o2.name);
else
return o2.score-o1.score; //按照分数大小的反序比较
}
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2