侧边栏壁纸
博主头像
LYMTICS

海纳百川,有容乃大

  • 累计撰写 45 篇文章
  • 累计创建 37 个标签
  • 累计收到 19 条评论

目 录CONTENT

文章目录

Java对int[]进行逆序排序

LYMTICS
2021-12-24 / 0 评论 / 0 点赞 / 43 阅读 / 1,281 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-03-26,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

今天刷力扣题目56. 合并区间时,打算第一步对数组进行一个逆序排序。我知道正序排序很简单,如下:

int [] arr = {1,3,2,4};
Arrays.sort(arr);

逆序的话,可以自定义一个Comparator,我本来是这么想的:

Arrays.sort(arr, (a, b)->b-a);

但是这样却没有用。我上网搜了一下,也没有相关的信息,所以作文以记之。

上面提到的方法运行后,报错如下:

错误: 对于sort(int[],(a,b)->b - a), 找不到合适的方法
		Arrays.sort(arr, (a,b)->b-a);
		      ^
    方法 Arrays.<T#1>sort(T#1[],Comparator<? super T#1>)不适用
      (推论变量 T#1 具有不兼容的限制范围
        等式约束条件: int
        上限: Object)
    方法 Arrays.<T#2>sort(T#2[],int,int,Comparator<? super T#2>)不适用
      (无法推断类型变量 T#2
        (实际参数列表和形式参数列表长度不同))
  其中, T#1,T#2是类型变量:
    T#1扩展已在方法 <T#1>sort(T#1[],Comparator<? super T#1>)中声明的Object
    T#2扩展已在方法 <T#2>sort(T#2[],int,int,Comparator<? super T#2>)中声明的Object
注: 某些消息已经过简化; 请使用 -Xdiags:verbose 重新编译以获得完整输出
1 个错误

可以看到是类型的错误,而我们也知道包装类和原始数据类型是不可以混用的,那么假如我们把数组声明为Integer[],再试一下:

Integer [] arr = {1,3,2,4};
Arrays.sort(arr, (a,b)->b-a);

可以成功运行!

但是假如题目给的是一个int数组,那么我们有两种选择:

  1. 我们需要自己写代码把他转换成Integer数组
Integer tmp = new Integer[arr.length];
for (int i=0; i < arr.length; i++) {
    tmp[i] = (Integer) arr[i];
}

因为lambda表达式代替的还是Arrays.sort的第二个参数,也就是Comparator<>接口,但是泛型是不支持原始数据类型的,所以只能用在包装类型上。

  1. 先正序排序,然后再 reverse 一下
for (int i = 0; i < nums.length/2; i++) {
    int temp = nums[i];
    nums[i] = nums[nums.length - 1 - i];
    nums[nums.length - 1 - i] = temp;
}

假如是二维数组,按照第一位排序,那情况又发生了变化:

int[][] arr = {{1,2}, {3,1}, {2,3}, {4, 5}};
Arrays.sort(arr, (a, b)->b[0]-a[0]);

此时竟然不会报错,想了想也正常,毕竟数组本身属于引用类型。

0

评论区