之前对自定义比较规则一直都不太熟练,属于眼睛学会了但手还不会的状态,最近碰到力扣的一道题目,决定做一个小笔记。
最大数
给定一组非负整数 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时,后面的值为正数,所以就从小到大进行排列。
之前一直有个误区,就是错误地将比较器理解为从小到大,从大到小排列,但是等到了其他集合类的时候,发现这个法则行不通了,还要结合具体的集合类进行分析。
这是我关于比较器的思路,如果理解是错误的话,希望大家能帮我改正。