对于比较类Comparator方法int compare(T o1, T o2)的应用与理解

一. 前言

Comparator类是一个被@FunctionalInterface标注的函数式接口, 故通常状况下只需实现其int compare(T o1, T o2)方法, 且通常以匿名内部类或lambda的形式出现, 常见的应用场景如:

  1. 集合排序:
list.sort(Comparator<? super E> c)
list.stream().sorted(Comparator<? super T> comparator)
Collections.sort(List<T> list, Comparator<? super T> c)
  1. 创建有序集合:
new TreeSet<>(Comparator<? super E> comparator)
new TreeMap<>(Comparator<? super K> comparator)

二. 如何根据 int compare(T o1, T o2) 方法的返回值进行排序?

先看jdk中对于该方法参数及返回值的注释说明:
在这里插入图片描述
如果直译的话可能不太容易理解甚至容易给人造成困惑, 故可以将其以一种更容易接受的方式进行同等表述, 即 理解方式一 :

  • 参数o1代表前面一个元素, o2代表后面一个元素.
  • 当该方法返回负数值时, 代表o1会排在o2前面, 当该方法返回正数值时, 代表o1会排在o2后面, 当返回0时, 代表o1与o2的位置不变.

或者用另一种方式理解, 即 理解方式二 :

  • 参数o1代表前面一个元素, o2代表后面一个元素.
  • 当该方法返回负数值时, 代表o1与o2的位置不做交换, 当该方法返回正数值时, 代表o1与o2的位置进行交换, 当返回0时, 代表o1与o2的位置不变.

以上两种方式的理解对于该方法的结果是同等效果的, 如果是初学者需要硬性记忆, 择其一即可.

三. 举例说明

现在带入以上第二条的理解, 重写 int compare(T o1, T o2) 方法来对以下集合排序:

List<Integer> list = new ArrayList<>();
list.add(3);
list.add(1);
list.add(2);
list.add(4);
list.add(5);
  1. 按集合元素从小到大排序:
//正序排列: 即元素数值小的在前面, 元素数值大的在后面
list.sort((o1, o2) -> {
    // 理解方式一: 前一元素小于后一元素, 则将前一元素排在后一元素前面(返回负数)
    // 理解方式二: 前一元素小于后一元素, 则前一元素与后一元素位置不交换(返回负数)
    if (o1 < o2) {
        return -1;
    }
    // 理解方式一: 前一元素大于后一元素, 则将前一元素排在后一元素后面(返回正数)
    // 理解方式二: 前一元素大于后一元素, 则前一元素与后一元素位置交换(返回正数)
    if (o1 > o2) {
        return 1;
    }
    // 理解方式一/二: 前一元素等于后一元素, 则前一元素与后一元素位置不变(返回0)
    return 0;
});
System.out.println(list); //输出: [1, 2, 3, 4, 5]
  1. 按集合元素从大到小排序:
//倒序排列: 即元素数值大的在前面, 元素数值小的在后面
list.sort((o1, o2) -> {
    if (o1 < o2) {
        // 理解方式一: 前一元素小于后一元素, 则将前一元素排在后一元素后面(返回正数)
        // 理解方式二: 前一元素小于后一元素, 则前一元素与后一元素位置交换(返回正数)
        return 1;
    }
    // 理解方式一: 前一元素大于后一元素, 则将前一元素排在后一元素前面(返回负数)
    // 理解方式二: 前一元素大于后一元素, 则前一元素与后一元素位置不交换(返回负数)
    if (o1 > o2) {
        return -1;
    }
    // 理解方式一/二: 前一元素等于后一元素, 则前一元素与后一元素位置不变(返回0)
    return 0;
});
System.out.println(list); //输出: [5, 4, 3, 2, 1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值