Arrays.sort()中关于Comparator()匿名内部类的使用案例

15 篇文章 0 订阅
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

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小小通信码农

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

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

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

打赏作者

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

抵扣说明:

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

余额充值