class Test{
public static void main(String[] args) {
int[] nums={4,5,7,8,0,3};
Integer[] numsArr = new Integer[nums.length];
for (int i = 0; i < nums.length; i++) {
numsArr[i] = nums[i];
}
Arrays.sort(numsArr,new Comparator<Integer>(){
public int compare(Integer num1,Integer num2){
return num1-num2;
}
});
for (Integer integer : numsArr) {
System.out.println(integer);
}
}
}
从一个简单的例子引入,因为Comparator<Integer>()中传入的泛型类型必须是引用类型,所以这里先把int数组转换为Integer类型的数组。
可以看到Arrays.sort()中传入了两个参数,一个是需要排序的数组,另外一个是排序规则(本质上应该是一个实现Comparator接口的一个方法),并且这个实现接口的方法要重写compare方法(方法内部定义排序规则),compare的返回值为int类型,如果返回值为正数就交换顺序,反之则不交换顺序。
compare()方法的返回值为int,当num1-num2>=0时,说明需要交换;当num1-num2<0时,说明不需要交换,那么此时的排序顺序是从小到大的(我的理解是按照compare输入参数的顺序对比的)。我们要在compare方法里定义我们的对比规则。如果我们把num1-num2改为num2-num1,那就是从大到小的排序了,可自行体会。
其实上面的代码和这段的结果是一样的:
Arrays.sort(nums);
然后如果需要复杂的业务逻辑,比如[4,45,6,7],我们需要重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数,就是说这一题的结果是76454,我们需要重点注意4和45的比较,因为要比较445和454的大小。这里我们的代码如下:
import java.util.Arrays;
import java.util.Comparator;
class Test2{
public static void main(String[] args) {
int[] nums={4,45,6,7};
Integer[] numsArr = new Integer[nums.length];
for (int i = 0; i < nums.length; i++) {
numsArr[i] = nums[i];
}
Arrays.sort(numsArr,new Comparator<Integer>(){
public int compare(Integer num1,Integer num2){
long s1=10,s2=10;
while(s1<=num1){
s1=s1*10;
}
while(s2<=num2){
s2=s2*10;
}
return (int)((num2*s1+num1)-(num1*s2+num2));
}
});
for (Integer integer : numsArr) {
System.out.println(integer);
}
}
}
注意这里的重写的compare()方法的比较,也就是当454-445>0的时候交换4和45的顺序,就变成[45,4]。
运行结果为:
7
6
45
4