Не найден подходящий метод для сортировки

#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 метода, принимающего an int[] , который также принимает a Comparator . Единственный sort метод, принимающий a Comparator , предназначен для массива объектов. Вы не можете сортировать примитивные массивы с помощью a Comparator , используя встроенные методы.

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);