32 把数组排成最小的数
题目要求:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
比较器就是一个接口,通过实现这个接口重写compare方法,返回正值代表大于返回0代表等于,返回负值代表小于。这样就可以自定义排序方法。jdk8的List本身也支持比较器排序。jdk7中集合可以使用Collections的sort方法,实现自定义比较器排序,数组可以通过Arrays.sort()方法实现自定义比较器排序。
有个问题,为啥不直接用Arrays.sort(numbers, new compartor),而是要放到list里,用collection.sort
因为 1+23=24 23+1也为24
实现Comparator这个接口为什么是通过new Comparator<>()这难道不是在实例化么?但是接口是不能实例化的 啊
实例化的不是接口,是类,匿名内部类,在jdk8中函数式接口也可以使用lambda表达式。
那这个匿名内部类在哪里定义的呢?是不是以后要实例化实现了接的匿名类,都可以通过直接new的方式呢?
我可能表达得不是很清楚。匿名内部类因为是匿名得所以它本身并不存在类名,所以只能通过返回接口或者父类引用。匿名内部类得创建通常是通过在参数中通过new一个接口或父类来实例化一个匿名内部类并返回这个接口或父类引用,还有另外一种方法是在类的方法内部通过return new 接口|类{}返回一个匿名内部类。
ava的Arrays.sort是快排,Collections.sort是归并排序,均为O(nlogn)
关于比较器,比如例题中的{3,32,321} 数组中先放入3,而后3和32比较,因为332>323 所以3>32 数组此时为[32,3]; 再往数组中加入321,先与32比较,32132<32321 故 321<32 故321应排在32前面,再与3比较 3213<3321 故321<3 数组最终排序[321,32,3]
1 import java.util.ArrayList; 2 import java.util.Comparator; 3 import java.util.Collections; 4 public class Solution{ 5 public String PrintMinNumber(int [] numbers){ 6 int len = numbers.length; 7 ArrayList<Integer> list = new ArrayList<Integer>(); 8 for(int i=0;i<len;i++){ 9 list.add(numbers[i]);//调试的时候,number少打了个s,真是服了 10 } 11 Collections.sort(list,new Comparator<Integer>(){ 12 @Override 13 public int compare(Integer str1,Integer str2){//重写了Comparator接口的compare()方法 14 String s1=str1+""+str2; 15 String s2=str2+""+str1; 16 return s1.compareTo(s2); 17 } 18 }); 19 StringBuilder s = new StringBuilder(); 20 list.forEach(s::append); 21 return s.toString(); 22 } 23 }
这两个方法经常搞混淆,现对其进行总结以加深记忆。
- compareTo(Object o)方法是java.lang.Comparable接口中的方法,当需要对某个类的对象进行排序时,该类需要实现Comparable接口的,必须重写public int compareTo(T o)方法,
- compare(Object o1,Object o2)方法是java.util.Comparator接口的方法,它实际上用的是待比较对象的compareTo(Object o)方法。
作者:shareidea
出处:https://www.cnblogs.com/shareidea94/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

浙公网安备 33010602011771号