java.util 包下接口 Comparator
可以将 Comparator 接口的实例传递给 sort 方法(如 Collections.sort或Arrays.sort),从而允许在排序顺序上实现精确控制。还可以使用 Comparator 来控制某些数据结构(如有序set或有序映射)的顺序,或者为那些没有自然顺序的对象 collection 提供排序。
int compare(T o1, T o2)
方法详细信息
o1--要比较的第一个对象。 o2--要比较的第二个对象。
返回:
根据第一个参数小于、等于或大于第二个参数分别返回负整数、零或正整数。
抛出:
ClassCastException --如果参数的类型不允许此 Comparator 对它们进行比较。
可通过重写Comparator接口中的抽象方法compare,自定义元素的排序方式。
Compare的返回值反应的是两个参数的权重,返回值正整数时,前者(o1)权重大,返回值为负整数时,后者(o2)权重大。然后排序结果按照权重(注意这里不是值的大小)由小到大进行排序。即权重默认升序排列。
例:o1 =4 ,o2 = 6;
return o2 – o1; {即返回值为正数,即为1,那么前者权重大,排序为o2,o1;
即为6,4,值降序排列}
return o1 – o2; {即返回值为负数,即为-1,那么后者权重大,排序为o1,o2;
即为4,6,值升序排列}
参数为接口时,可以使用lambda表达式。
1) Lambda表达式的标准格式为:(参数类型 参数名称) ‐> { 代码语句 }
1. 小括号内的语法与传统方法参数列表一致:无参数则留空;多个参数则用逗号分隔。
2. ->是新引入的语法格式,代表指向动作。
3. 大括号内的语法与传统方法体要求基本一致。
2) Lambda省略格式
1. 小括号内参数的类型可以省略;
2. 如果小括号内有且仅有一个参,则小括号可以省略;
3. 如果大括号内有且仅有一个语句,则无论是否有返回值,都可以省略大括号、return关键字及语句分号。
3) Lambda的使用前提
1. 使用Lambda必须具有接口,且要求接口中有且仅有一个抽象方法。无论是JDK内置的 Runnable 、 Comparator 接口还是自定义的接口,只有当接口中的抽象方法存在且唯一 时,才可以使用Lambda。
2. 使用Lambda必须具有上下文推断。也就是方法的参数或局部变量类型必须为Lambda对应的接口类型,才能使用Lambda作为该接口的实例。
例:用Comparator接口对学生对象实现排序(三种方法)
public class ComparatorTest {
public static void main(String[] args) {
// 创建学生对象
Student2 s1 = new Student2("zs", 22, 77);
Student2 s2 = new Student2("ls", 21, 88);
Student2 s3 = new Student2("ww", 25, 66);
Student2 s4 = new Student2("zl", 22, 99);
Student2 s5 = new Student2("长风", 26, 59);
// 填充数组
Student2[] students = {s1, s2, s3, s4, s5};
// 排序前
System.out.println("排序前");
System.out.println(Arrays.toString(students));
// 排序 使用带比较器的sort方法
Arrays.sort(students, new MyComparator());
// 使用匿名内部类
Arrays.sort(students, new Comparator<Student2>() {
@Override
public int compare(Student2 o1, Student2 o2) {
return o1.score() - o2.score();
}
});
// 使用lambda
Arrays.sort(students, (stu1, stu2) -> stu2.score() - stu1.score());
// 排序后
System.out.println("排序后");
System.out.println(Arrays.toString(students));
}
}
class Student2{
String name;
int age;
int score;
public Student2(String name, int age, int score) {
this.name = name;
this.age = age;
this.score = score;
}
@Override
public String toString() {
return "Student2{" +
"name='" + name + '\'' +
", age=" + age +
", score=" + score +
'}';
}
}
// 手写实现类
class MyComparator implements Comparator<Student2> {
@Override
public int compare(Student2 o1, Student2 o2) {
// 按照年龄从小到大进行排序
//return o1.age() - o2.age();
return o2.age() - o1.age();
}
}