#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
Похоже метод с лямбдой использует дженерик, попробуйте написать анонимный класс. Если пользуетесь идеей, то может она подскажет как переделать в лямбду
Комментариев нет:
Отправить комментарий