#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); Подключать так:С Guava так: Collections.sort(Ints.asList(b), (x,y) -> y-x); Подключать так: net.mintern primitive 1.3 com.google.guava guava 23.2-jre Ответ 3
Похоже метод с лямбдой использует дженерик, попробуйте написать анонимный класс. Если пользуетесь идеей, то может она подскажет как переделать в лямбду
Комментариев нет:
Отправить комментарий