Java的comparator接口中compare方法比较原理

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();
    }
}

  • 9
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值