Comparator 接口实现排序
Comparator 接口实现排序
将此接口的实现传递给 Collections.sorts 方法或者 Arrays.sorts 方法实现排序
返回正数,负数,零分别代表大于,小于,等于
Comparable:强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的 compareTo方法被称为它的自然比较方法。只能在类中实现compareTo()一次,不能经常修改类的代码 实现自己想要的排序。实现此接口的对象列表(和数组)可以通过Collections.sort(和Arrays.sort)进行自动排序,对象可以用作有序映射中的键或有序集合中的元素,无需指定比较器。
Comparator:强行对某个对象进行整体排序。可以将Comparator 传递给sort方法(如Collections.sort 或 Arrays.sort),从而允许在排序顺序上实现精确控制。还可以使用Comparator来控制某些数据结构 (如有序set或有序映射)的顺序,或者为那些没有自然顺序的对象collection提供排序。
单一条件排序
List<Student> stu1 = new ArrayList<Student>(){
{
add(new Student("啊三", 15));
add(new Student("赵武", 16));
add(new Student("李八", 18));
}
};
//1. 按照年龄
Collections.sort(stu1, new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
return o1.getAge()-o2.getAge();
//return o2.getAge()-o1.getAge();
}
});
//2. 按照姓名字母顺序
Comparator comparator = Collator.getInstance(Locale.CHINA);
Collections.sort(stu1, new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
return comparator.compare(o1.getName(), o2.getName());
}
});
System.out.println(stu1);
使用 lambda 表达式进行简化
允许通过表达式代替接口
Collections.sort(stu1, (s1,s2)->(s1.getAge()-s2.getAge()));
System.out.println(stu1);
多条件排序
List<Student> stu1 = new ArrayList<Student>(){
{
add(new Student("一", 17, 1));
add(new Student("二", 16, 3));
add(new Student("三", 39, 10));
add(new Student("四", 52, 12));
add(new Student("五", 18, 6));
add(new Student("六", 43, 9));
}
};
Collections.sort(stu1, new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
if(o1.getAge1() == o2.getAge1()){
return o1.getAge2()-o2.getAge2();
}else{
return o1.getAge1()-o1.getAge1();
}
}
});
for(Student s: stu1){
System.out.println(s.getName()+" "+s.getAge1()+" "+s.getAge2());
}
自定义条件排序
String[] order = {"语文","数学","英语","物理","化学","生物","政治","历史","地理","总分"};
final List<String> definedOrder = Arrays.asList(order);
List<String> list = new ArrayList<String>(){
{
add("总分");
add("英语");
add("政治");
add("总分");
add("数学");
}
};
Collections.sort(list,new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
int io1 = definedOrder .indexOf(o1);
int io2 = definedOrder .indexOf(o2);
return io1-io2;
}
});
for(String s:list){
System.out.print(s+" ");
}

浙公网安备 33010602011771号