关于比较器的活学活用

之前对自定义比较规则一直都不太熟练,属于眼睛学会了但手还不会的状态,最近碰到力扣的一道题目,决定做一个小笔记。

最大数
给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。

注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。

示例 1:

输入:nums = [10,2]
输出:“210”

我们在使用比较器的时候一般都使用lamda表达式,简单利落。
返回值是int类型,我们的排序顺序也是与这个int值的大小密不可分。
举个例子:

(x,y) -> x-y

接受2个参数(数字),并返回他们的差值 (x, y) -> x – y

  • 如果x-y>0,则这个排列顺序就是从小到大
  • 如果x-y<0,则这个排列顺序就是从大到小

在这道力扣题中,数组是int数组,我们要用string的compareTo函数来比较字符串的大小。
所以就有个这个关键性的代码

PriorityQueue<String> pq = new PriorityQueue<>((x,y) -> (y+x).compareTo(x+y))

String的compareTo函数是compareTo之前的字符串的字典序减去括号内的字典序。
可以这样理解:

  • 当y+x>x+y时,此时后面这部分的int值为正数,则x>y
  • 当y+x<x+y时,此时后面这部分的int值为负数,则x<y
    而PriorityQueue底层是小根堆,所以直接按照从小到大排列即可
Arrays.sort(string,(x,y)->(x+y).compareTo(y+x));

Arrays的话就是当x+y > y+x时,后面的值为正数,所以就从小到大进行排列。

之前一直有个误区,就是错误地将比较器理解为从小到大,从大到小排列,但是等到了其他集合类的时候,发现这个法则行不通了,还要结合具体的集合类进行分析。

这是我关于比较器的思路,如果理解是错误的话,希望大家能帮我改正。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值