Страницы

Поиск по вопросам

понедельник, 6 января 2020 г.

Как отсортировать int[] со своим компаратором?

#java #коллекции #generics


Массив Integerов сортируется, а вот с массивом intов что-то не получается:

https://ideone.com/tXfCql

class Ideone {
  public static void main (String[] args) throws java.lang.Exception {
    Integer a[] = {1,2,3,4,5,6,7};
    int b[] = {1,2,3,4,5,6,7};

    Arrays.sort(a, (x,y) -> y-x);
    //Arrays.sort(b, (x,y) -> y-x);

    System.out.println(Arrays.toString(a));
    System.out.println(Arrays.toString(b));
  }
}


Если раскомментировать сортировку массива b, то будет ошибка

Main.java:11: error: no suitable method found for sort(int[],(x,y)->y - x)
    Arrays.sort(b, (x,y) -> y-x);
          ^
    method Arrays.sort(T#1[],Comparator) is not applicable
      (inference variable T#1 has incompatible bounds
        equality constraints: int
        upper bounds: Object)
    method Arrays.sort(T#2[],int,int,Comparator) 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 sort(T#1[],Comparator)
    T#2 extends Object declared in method sort(T#2[],int,int,Comparator)
Note: Some messages have been simplified; recompile with -Xdiags:verbose to get full
output
1 error


Как его правильно отсортировать с кастомным компаратором?
    


Ответы

Ответ 1



Массив Integerов сортируется, а вот с массивом intов что-то не получается И правильно, что не получается, так как дженерики (коим является Comparator) не параметризуются примитивами, а автобоксинг для массивов не работает. Как отсортировать int[] со своим компаратором? Так, как хотите Вы (непосредственно с помощью Arrays.sort(...)) -- никак, но есть множество альтернативных решений, которые перечислены в соседнем ответе.

Ответ 2



Не знаю, подойдёт ли вам такое решение, но в Java 8 можно так: b = IntStream.of(b) .boxed() .sorted((x,y) -> y-x) .mapToInt(i -> i) .toArray(); С помощью Java Primitive можно так: Primitive.sort(b, (x, y) -> Integer.compare(y, x), false); Подключать так: net.mintern primitive 1.3 С Guava так: Collections.sort(Ints.asList(b), (x,y) -> y-x); Подключать так: com.google.guava guava 23.2-jre

Ответ 3



Похоже метод с лямбдой использует дженерик, попробуйте написать анонимный класс. Если пользуетесь идеей, то может она подскажет как переделать в лямбду

Комментариев нет:

Отправить комментарий