问题
My code is shown below:
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;
}
});
}
}
I want to sort the array in decreasing order by using comparator, but it always shows
Line 14: error: no suitable method found for sort(int[],int,int, anonymous Comparator)
Can anyone point out where is the problem? Thanks a lot!
回答1:
There is no method that takes a primitive array like int[] nums
and sorts it in descending order. There are some that take an array of Objects, like sort(T[] a, Comparator<? super T> c) - but primitives are not Objects
1.
The most straightforward method is likely to simply sort(int[] input)
your array in ascending order, then reverse the resulting array. The sort is likely to take significantly longer than the reverse, so this method should perform well. Alternately, you may be able to modify the consuming code so that it deals with the array in ascending order, or you could wrap the array in a List
and then use a reversed view.
There are lots of other options as well.
1 You could, in principle, convert your int[]
into an Integer[]
, by boxing each underlying int
element, but you would pay a large performance penalty and a huge memory (increasing the memory used by about 10x) and garbage penalty to do so.
回答2:
Your array is of type int
and Comparator generic type is Integer
. Change your array type to Integer and everything will be fine, like this:
public void nextPermutation(Integer[] nums) {...
回答3:
Your nums
array must be of type Integer
.
回答4:
The Arrays.sort
overload that takes a Comparator
can only work on arrays of Objects; int
isn't a valid substitution for a generic type argument.
So,
Integer[] intObjs = ...;
int[] intPrimitives = ...;
Arrays.sort(intObjs, start, end, someComparator); //OK
Arrays.sort(intPrimitives, start, end, someComparator); //fails
For what you want to work, there'd have to be an Arrays.sort overload declared to take an int[]
- but that'd be a costly sort, since it'd basically require boxing the int
s for each comparison.
来源:https://stackoverflow.com/questions/39884385/java-comparator-for-arrays-sort