[LeetCode]179. 最大数(java实现)重载sort方法、含对Collections.sort()的一些简单阐述

[LeetCode]179. 最大数(java实现)重载sort方法、含对Collections.sort()的一些简单阐述

1. 题目

在这里插入图片描述
在这里插入图片描述

2. 读题(需要重点注意的东西)

思路(重载sort方法):

首先,我们要知道如下的定理:
在这里插入图片描述
如何证明该比较运算能够进行排序?

能够进行排序的运算属于全序关系,满足以下三个条件的运算属于全序关系:
在这里插入图片描述
具体步骤:

  1. 比较两个数a、b,如果 a > b,将a放在b的前面

  2. 注意有前导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);
});
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cloudeeeee

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值