Java8_常用排序方法


静态方法 Comparator.comparing 返回一个 Comparator 对象,该对象提供了一个函数可以提取排序
关键字。

新的实例方法包含了下面这些。

  • reversed ——对当前的 Comparator 对象进行逆序排序,并返回排序之后新的
    Comparator 对象。
  • thenComparing ——当两个对象相同时,返回使用另一个 Comparator 进行比较的
    Comparator 对象。
  • thenComparingInt 、 thenComparingDouble 、 thenComparingLong ——这些方法的
    工作方式和 thenComparing 方法类似,不过它们的处理函数是特别针对某些基本数据类型(分别对应于 ToIntFunction 、 ToDoubleFunction 和 ToLongFunction )的。

新的静态方法包括下面这些。

  • comparingInt 、 comparingDouble 、 comparingLong ——它们的工作方式和 comparing 类似,但接受的函数特别针对某些基本数据类型(分别对应于 ToIntFunction 、
    ToDoubleFunction 和 ToLongFunction )。

  • naturalOrder ——对 Comparable 对象进行自然排序,返回一个 Comparator 对象。

  • nullsFirst 、 nullsLast ——对空对象和非空对象进行比较,你可以指定空对象(null)
    比非空对象(non-null)小或者比非空对象大,返回值是一个 Comparator 对象。

  • reverseOrder ——和 naturalOrder().reversed() 方法类似。

按照给定的集合顺序对目标集合进行排序

List<String> list1 = new ArrayList<>();
list1.add("7388345e");
list1.add("982c504e");
list1.add("e5a90522");
list1.add("4445e195");

List<String> list2 = new ArrayList<>();
list2.add("4445e195");
list2.add("f87775bc");
list2.add("7388345e");
list2.add("443c55a4");
list2.add("e5a90522");
list2.add("982c504e");

// list1.sort(Comparator.comparingInt(list2::indexOf));

list1 = list1.stream()
    .sorted(Comparator.comparingInt(list2::indexOf))
    .collect(Collectors.toList());
System.out.println(list1);

/** list1是目标集合, 按照list2的顺序进行排序 
返回结果:
    [4445e195, 7388345e, e5a90522, 982c504e]
*/

逆序

// 源码
public static <T, U extends Comparable<? super U>> Comparator<T> comparing(
            Function<? super T, ? extends U> keyExtractor) {
    Objects.requireNonNull(keyExtractor);
    return (Comparator<T> & Serializable)
        (c1, c2) -> keyExtractor.apply(c1).compareTo(keyExtractor.apply(c2));
}
// 错误写法
list1.sort(Comparator.comparing(val -> val.substring(1,2)).reversed());

编译不会通过, Connot resolve method 'substring' in 'Object'

Lambda的类型是从使用Lambda的上下文推断出来的,这里的 val 会被解析成Object,当然找不到 substring。

错误编写

// 正确写法
list1.sort(Comparator.comparing((String val) -> val.substring(1,2)).reversed());

/** 返回结果: 
	[982c504e, e5a90522, 4445e195, 7388345e]
*/

比较器链

list1.sort(Comparator.comparing((String val) -> val.substring(val.length() - 1))
           .reversed()
           .thenComparing((String val) -> val.substring(val.length() - 2)));

/**
	先按照最后一位逆序, 如果最后一位相同, 再按照倒数第二位排序
	[982c504e, 7388345e, 4445e195, e5a90522]
*/
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值