[LeetCode]179. 最大数(java实现)重载sort方法、含对Collections.sort()的一些简单阐述
1. 题目
2. 读题(需要重点注意的东西)
思路(重载sort方法):
首先,我们要知道如下的定理:
如何证明该比较运算能够进行排序?
能够进行排序的运算属于全序关系,满足以下三个条件的运算属于全序关系:
具体步骤:
-
比较两个数a、b,如果 a > b,将a放在b的前面
-
注意有前导0的情况,需要将前导0全部去除,保留最后一个0
3. 解法
---------------------------------------------------解法---------------------------------------------------
class Solution {
public String largestNumber(int[] nums) {
int n = nums.length;
// 将int数组转换为string数组
String[] s = new String[n];
for(int i = 0;i < n;i++) s[i] = nums[i] + "";
// 重载sort方法,让sort函数基于字符串ab和ba的大小对字符串s进行排序
// lambda表达式基本格式:()->{}
// Collections.sort函数是根据传入的两个参数比较进行排序的
Arrays.sort(s,(a,b)->{
String x = "" + a + b;
String y = "" + b + a;
/**
y.compareTo(x)
如果参数字符串x等于此字符串y,则返回值 0;
如果此字符串x小于字符串参数y,则返回一个小于 0 的值;
如果此字符串x大于字符串参数y,则返回一个大于 0 的值。
*/
return y.compareTo(x);
});
// 将字符串数组转换为字符串
String res = "";
for(int i = 0;i < n;i++) res += s[i];
int k = 0;
while(k < n - 1 && res.charAt(k) == '0') k++;
// 去除前导0,保留后面的所有数
return res.substring(k);
}
}
可能存在的问题:
问题: 我有点不理解重载sort方法
。
回答: 事实上,sort方法: Collections.sort(数组,比较器comparator) 会传入两个参数,第一个是进行比较的数组,第二个则是实现了Comparator接口的类的实例,即比较器comparator
。
我们来看一下Comparator接口:
public interface Comparator<T> {
int compare(T first,T second);
}
要按ab和ba哪个大来排序字符串数组,我们就需要根据这个条件,实现compare方法:
class comparator implements Comparator<String>{
public int compare(String a,String b){
String x = "" + a + b;
String y = "" + b + a;
return y.compareTo(x);
}
}
然后使用该比较器进行排序:Collections.sort(s,comparator)
这样写很麻烦,是不是,还需要定义一个类,于是我们使用lambda表达式
,简化代码:
lambda表达式
的基础结构是 :(参数1,参数2,...)-> { // 实现的代码块 }
因此,我们将a放在参数1的位置,b放在参数2的位置,将实现的代码放在大括号内,就像这样:
(a,b) ->{
String x = "" + a + b;
String y = "" + b + a;
return y.compareTo(x);
}
这就是我们实现好的compare方法。
最后,我们将数组s和实现好的比较器传入 Collections.sort() 中,得到:
Arrays.sort(s,(a,b)->{
String x = "" + a + b;
String y = "" + b + a;
return y.compareTo(x);
});
4. 可能有帮助的前置习题
5. 所用到的数据结构与算法思想
6. 总结
重载sort方法
,让sort函数基于字符串ab和ba的大小对字符串s进行排序
Arrays.sort(s,(a,b)->{
String x = "" + a + b;
String y = "" + b + a;
/**
y.compareTo(x)
如果参数字符串x等于此字符串y,则返回值 0;
如果此字符串x小于字符串参数y,则返回一个小于 0 的值;
如果此字符串x大于字符串参数y,则返回一个大于 0 的值。
*/
return y.compareTo(x);
});