#java #arrays #sorting
#java #массивы #сортировка
Вопрос:
Я столкнулся со странной проблемой компилятора Java
Вот код
public int[] findRightInterval(int[][] intervals) {
int n = intervals.length;
int[] intIdx = new int[n];
for(int i=0;i<n;i ) {
intIdx[i]=i;
}
Arrays.sort(intIdx, (a, b) -> (intervals[a][0]-intervals[b][0]));
...
}
Полная ошибка
Line 8: error: no suitable method found for
sort(int[],(a,b)->(in[...]][0]))
Arrays.sort(intIdx, (a, b) -> (intervals[a][0]-intervals[b][0]));
^
method Arrays.<T#1>sort(T#1[],Comparator<? super T#1>) is not applicable
(inference variable T#1 has incompatible bounds
equality constraints: int
lower bounds: Object)
method Arrays.<T#2>sort(T#2[],int,int,Comparator<? super T#2>) is not applicable
(cannot infer type-variable(s) T#2
(actual and formal argument lists differ in length)) where T#1,T#2 are type-variables:
T#1 extends Object declared in method <T#1>sort(T#1[],Comparator<? super T#1>)
T#2 extends Object declared in method <T#2>sort(T#2[],int,int,Comparator<? super T#2>)
С другой стороны,
если я Arrays.sort(intIdx, (a, b) -> (intervals[a][0]-intervals[b][0]));
заменю Arrays.sort(intervals, (a, b) -> (a[0]-b[0]));
его, он будет работать нормально.
Интересно, почему компилятор выдает эту ошибку?
Комментарии:
1. Потому что в массивах нет метода для сортировки
int[]
массива с помощью компаратора.2. Посмотрите на документацию , то есть на список
sort
методов в javadoc дляArrays
, и вы увидите, что нетsort
метода, принимающего anint[]
, который также принимает aComparator
. Единственныйsort
метод, принимающий aComparator
, предназначен для массива объектов. Вы не можете сортировать примитивные массивы с помощью aComparator
, используя встроенные методы.3. Что вы на самом деле пытаетесь здесь сделать? Похоже, вы хотите отсортировать внешний массив по убыванию значения с индексом 0 во внутреннем массиве. Так почему бы не отсортировать внешний массив? Это объект, поэтому вы можете отсортировать его с
Comparator
помощью . Например.int[][] copy = intervals.clone(); Arrays.sort(copy, (a, b) -> Integer.compare(a[0], b[0]));
Ответ №1:
public static <T> void Arrays.sort(T[] a, Comparator<? super T> c)
Вы не можете сортировать int[]
массив с помощью comparator. Только Integer[]
. Итак, ваш фрагмент может быть переписан с помощью:
Arrays.sort(Arrays.stream(intIdx).boxed().toArray(), (a, b) -> intervals[a][0] - intervals[b][0]);
PS Я рекомендую вам использовать Stream
для вашего примера:
intIdx = Arrays.stream(intIdx)
.boxed()
.sorted(Comparator.comparingInt(a -> intervals[a][0]))
.mapToInt(i -> i)
.toArray();
Комментарии:
1. Если вы выполняете потоковую передачу на упакованные
Integer
объекты, было бы гораздо разумнее сортировать в потоке, используяsorted(...)
. Этот код, безусловно, не имеет смысла, потому что он создает и сортирует массив, а затем сразу же выбрасывает массив, так в чем смысл?2. Этот новый пример потока ничего не делает, поскольку нет терминальной операции.
3. но
Arrays.sort(intervals, (a, b) -> (a[0]-b[0]))
работает? это также примитивный тип
Ответ №2:
вы можете импортировать встроенные коллекции классов;
и напишите это:Collections.sort(array);