java比较器用于数组排序

时间:2016-10-05 22:00:21

标签: java arrays comparator

我的代码如下所示:

public class Solution {
    public void nextPermutation(int[] nums) {
        int k = 0;
        for(int i = nums.length -1; i> 0 ;i--){
            if(nums[i-1] < nums[i]){
                k = i-1;
                break;
            }
        }
        if( k == 0) {Arrays.sort(nums); return;}
        int tmp = nums[k];
        nums[k] = nums[nums.length - 1];
        nums[nums.length-1] = tmp;
        Arrays.sort(nums,k+1,nums.length,new Comparator<Integer>(){
            public int compare(Integer a, Integer b){
                return b - a;
            }
        });
    }    
}

我想通过使用比较器按递减顺序对数组进行排序,但它始终显示

  

第14行:错误:找不到合适的sort方法(int [],int,int,   匿名比较者)

有谁可以指出问题出在哪里?非常感谢!

4 个答案:

答案 0 :(得分:1)

您的数组类型为int,而比较器泛型类型为Integer。将您的数组类型更改为Integer,一切都会正常,如下所示:

public void nextPermutation(Integer[] nums) {...

答案 1 :(得分:1)

没有方法采用像int[] nums这样的原语数组,并按降序对其进行排序。有一些采用对象数组,如sort(T[] a, Comparator<? super T> c) - 但原语不是Objects 1

最简单的方法可能只是按升序排列sort(int[] input)数组,然后reverse得到的数组。排序可能需要比反向更长的时间,因此这种方法应该表现良好。或者,您可以修改使用代码,使其以升序处理数组,或者可以将数组包装在List中,然后使用反转视图。

还有lots of other options

1 原则上,您可以将int[]转换为Integer[],通过装箱每个基础int元素,但您需要付出很大的代价惩罚和巨大的记忆(增加大约10倍使用的内存)和垃圾惩罚这样做。

答案 2 :(得分:0)

您的nums数组必须是Integer类型。

答案 3 :(得分:0)

Arrays.sort的{​​{1}}重载只能用于对象数组; Comparator不是泛型类型参数的有效替换。

所以,

int

对于你想要工作的东西,必须有一个声明采用Integer[] intObjs = ...; int[] intPrimitives = ...; Arrays.sort(intObjs, start, end, someComparator); //OK Arrays.sort(intPrimitives, start, end, someComparator); //fails 的Arrays.sort重载 - 但这是一个代价高昂的类型,因为它基本上需要装箱{{ 1}} s用于每次比较。