剑指Offer——巧妙使用sort(List<T>,Comparator< super T>)比较器_comparator< super t>

/**

  • @date 2016-09-15

  • @number 04

  • @author SHQ

  • 把数组排成最小的数

  • 题目描述

  •    输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
    
  •    例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
    
  • 思路

  • 通过Collection.sort()方法中的自定义比较器实现。若mn>nm,则说明nm满足要求。

  • 时间复杂度 O(nlogn);

  • 空间复杂度O(2);
    */
    public static void main(String[] args) {
    int[] numbers = {3,5,1,4,2};
    System.out.println(PrintMinNumber(numbers));
    }
    private static String PrintMinNumber(int [] numbers) {
    if(numbers == null || numbers.length == 0){
    return null;
    }
    ArrayList list = new ArrayList();
    for(int i = 0; i < numbers.length; i++){
    list.add(numbers[i]);
    }
    // 升序(自定义比较器)
    Collections.sort(list, new Comparator() {
    @Override
    public int compare(Integer str1, Integer str2) {// 实现接口中的方法
    return (str1+“”+str2).compareTo(str2+“”+str1);
    }
    });

     StringBuffer sb = new StringBuffer();
     for(int str : list){
     sb.append(str);
     }
     return sb.toString();
    

    }
    }


 


### **注  sort讲解**


    翻翻 API 会发现, Arrays.sort 还有种重载形式:sort(T[] a, Comparator<? super T> c) ,这个方法参数的写法用到了泛型,我们还没讲到。我们可以把它理解成这样的形式: sort(Object[] a, Comparator c) ,这个方法的意思是按照比较器 c 给出的比较排序算法,对 Object 数组进行排序。Comparator 接口中定义了两个方法: compare(Object o1, Object o2) 和 equals 方法,由于 equals 方法所有对象都有的方法,因此当我们实现 Comparator 接口时,我们只需重写 compare 方法,而不需重写 equals 方法。Comparator 接口中对重写 equals 方法的描述是:“注意,不重写 Object.equals(Object) 方法总是安全的。然而,在某些情况下,重写此方法可以允许程序确定两个不同的 Comparator 是否强行实施了相同的排序,从而提高性能。”。我们只需知道第一句话就OK了,也就是说,可以不用去想应该怎么实现 equals 方法,因为即使我们不显示实现 equals 方法,而是使用Object类的 equals 方法,代码依然是安全的。


    排序算法是一个经过修改的**合并排序**算法(其中,如果低子列表中的最高元素小于高子列表中的最低元素,则忽略合并)。此算法提供可保证的 n log(n) 性能。指定列表必须是可修改的,但不必是可大小调整的。此实现将指定列表转储到一个数组中,并对数组进行排序,在重置数组中相应位置每个元素的列表上进行迭代。这避免了由于试图原地对链接列表进行排序而产生的 n2 log(n) 性能。


    参数:


    list - 要排序的列表。


    c - 确定列表顺序的比较器。null 值指示应该使用元素的自然顺序。


  抛出:



### 最后

你要问前端开发难不难,我就得说计算机领域里常说的一句话,这句话就是『**难的不会,会的不难**』,对于不熟悉某领域技术的人来说,因为不了解所以产生神秘感,神秘感就会让人感觉很难,也就是『难的不会』;当学会这项技术之后,知道什么什么技术能做到什么做不到,只是做起来花多少时间的问题而已,没啥难的,所以就是『会的不难』。

**[开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】](https://bbs.csdn.net/topics/618166371)**

**我特地针对初学者整理一套前端学习资料**

![前端路线图](https://img-blog.csdnimg.cn/img_convert/b64670d43307d88dce0743e552bba1a7.webp?x-oss-process=image/format,png)

1)**

**我特地针对初学者整理一套前端学习资料**

[外链图片转存中...(img-GdzZ6zBm-1714635109344)]

![vue.js的36个技巧](https://img-blog.csdnimg.cn/img_convert/5707098ec39dc9f90018b9608c929ee3.webp?x-oss-process=image/format,png)
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值