Сортировать целочисленный массив, используя интерфейс компаратора и лямбда-выражение - PullRequest
0 голосов
/ 29 июня 2019

Я пытаюсь отсортировать массив целых чисел путем реализации метода сравнения интерфейса Comparator с использованием лямбда-выражения. Я не мог понять ошибку, выданную компилятором. Пожалуйста, помогите.

Я пытался выполнить код ниже:

import java.util.Arrays;
public class MyClass{ 
    public static void main(String args[]) {

     int[] arr = {5,3,7,8,1,4,6,9};

    Arrays.sort(arr, (int o1, int o2) -> o1 - o2);

     System.out.println(Arrays.toString(arr));
}
}

Фактический результат: -

/MyClass.java:9: error: no suitable method found for sort(int[],(int o1, i[...] - o2)
    Arrays.sort(arr, (int o1, int o2) -> o1 - o2);
          ^
    method Arrays.<T#1>sort(T#1[],Comparator<? super T#1>) is not applicable
      (inference variable T#2 has incompatible bounds
        equality constraints: int
        upper bounds: Object)
    method Arrays.<T#3>sort(T#3[],int,int,Comparator<? super T#3>) is not applicable
      (cannot infer type-variable(s) T#3
        (actual and formal argument lists differ in length))
  where T#1,T#2,T#3 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 interface Comparator
    T#3 extends Object declared in method <T#3>sort(T#3[],int,int,Comparator<? super T#3>)
Note: Some messages have been simplified; recompile with -Xdiags:verbose to get full output
1 error

Ожидаемое: -

Сортированный массив:

[1,3,4,5,6,7,8,9] 

Ответы [ 4 ]

5 голосов
/ 29 июня 2019

Нет переопределений Arrays::sort, которые принимают массив примитивов и лямбду в качестве параметра.

1 голос
/ 29 июня 2019

Класс Arrays обеспечивает сортировку для primitives, поэтому Comparator не требуется. Вот почему вы не можете указать один в качестве аргумента. Конечно, это также означает, что вы можете сортировать только в порядке ascending.

Чтобы отсортировать массив int в обратном или нисходящем порядке, вы можете сделать следующее:

           // convert to stream
           arr = Arrays.stream(arr)

           // wrap it in an Integer object
          .boxed()

           // sort it with specified Comparator
          .sorted(Comparator.reverseOrder())

           // "unbox" it (convert from Integer to int)                            
          .mapToInt(Integer::intValue)

           // and return them in an array
          .toArray();

Или вы можете просто начать с массива Integer и сделать это.

          Integer[] intArr = { 5, 2, 3, 7, 8, 1, 4, 6, 9
          };

          Arrays.sort(intArr,Comparator.reverseOrder());
1 голос
/ 29 июня 2019

Вам нужно использовать массив Integer [] для сортировки с помощью Comparator.Метод sort, который принимает массив int [], не поддерживает передачу Comparator.

Integer[] arr = {5, 3, 7, 8, 1, 4, 6, 9};

Arrays.sort(arr, (Integer o1, Integer o2) -> o1 - o2);
0 голосов
/ 07 июля 2019

Почему вы должны использовать Arrays.sort() вообще?

index = 0; // declared as class variableint[] arr = { 5, 3, 7, 8, 1, 4, 6, 9 };

лямбда-повторное использование старого массива:

IntStream.range( 0, arr.length ).boxed().map( i -> arr[i] )
  .sorted( (i1, i2) -> Integer.compare( i1, i2 ) ).forEach( i -> arr[index++] = i );  // arr == [1, 3, 4, 5, 6, 7, 8, 9]

… Для естественного порядка сортировки даже бокс не нужен:

IntStream.range( 0, arr.length ).map( i -> arr[i] )
  .sorted().forEach( i -> arr[index++] = i );  // arr == [1, 3, 4, 5, 6, 7, 8, 9]

Оба решения отображают содержимое массива на соответствующий ему индекс.Эта конструкция была выбрана, потому что результирующий поток имеет функцию sort(), которая принимает компаратор в качестве аргумента.После сортировки значения записываются обратно в arr в цикле forEach.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...