当我们需要对一个自定义的类按照某一种规则进行排序时,我们需要用Comparator来实现。
1、使用方法
例如,我们对5个学生按照中文姓名的先后顺序进行排序:
首先我们定义一个Student类
public class Student{
public String name;
public Student(String name) {
this.name = name;
}
}
然后是写自己的比较器,需要实现Comparator接口
public class MyComparator implements Comparator<Student>{
@Override
public int compare(Student o1, Student o2) {
if(o1.name.equals("张三"))
return -1;//返回-1表示,将第一个参数o1放在第二个参数o2之前
else if(o2.name.equals("张三"))
return 1;//返回1表示,将第二个参数o2放在第一个参数o1之前
else if(o1.name.equals("李四"))
return -1;
else if(o2.name.equals("李四"))
return 1;
else if(o1.name.equals("王五"))
return -1;
else if(o2.name.equals("王五"))
return 1;
else if(o1.name.equals("刘六"))
return -1;
else if(o2.name.equals("刘六"))
return 1;
else if(o1.name.equals("赵七"))
return -1;
else if(o2.name.equals("赵七"))
return 1;
return 0;
}
}
最后就是定义main函数了
public class ComparatorTest {
public static void main(String[] args) {
Student s1= new Student("张三");
Student s2= new Student("李四");
Student s3= new Student("王五");
Student s4= new Student("刘六");
Student s5= new Student("赵七");
List<Student> list = new Vector<>();
list.add(s2);
list.add(s5);
list.add(s4);
list.add(s1);
list.add(s2);
list.add(s3);
Collections.sort(list,new MyComparator());
for(Student s : list)
System.out.println(s.name);
}
}
可以看下运行结果:
2、Comparator排序原理
Comparator排序实际上就是二叉树排序:使用第一个元素作为根节点,如果之后的元素比第一个小,则放到左子树,否则放到右子树,之后按中序遍历。