我正在尝试通过使用lambda表达式实现Comparator接口的compare方法来对整数数组进行排序。我无法理解编译器给出的错误。请帮忙。
我尝试执行以下代码:
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]
答案 0 :(得分:5)
没有Arrays::sort
的覆盖将原始数组和lambda作为参数的覆盖。
答案 1 :(得分:1)
您将需要使用Integer []数组与Comparator进行排序。采用int []数组的sort方法不支持传递Comparator。
Integer[] arr = {5, 3, 7, 8, 1, 4, 6, 9};
Arrays.sort(arr, (Integer o1, Integer o2) -> o1 - o2);
答案 2 :(得分:1)
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());
答案 3 :(得分:0)
为什么要完全使用 Arrays.sort()
?
index = 0; // declared as class variable
int[] arr = { 5, 3, 7, 8, 1, 4, 6, 9 };
lambda重用旧数组:
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
。
答案 4 :(得分:0)
对于 jdk15。 对于原始类型,Arrays.sort 为您提供了一种快速排序的变体,它是升序的并且是固定的。您不能填写比较器。如果要按降序对数组进行排序,则必须编写丑陋的代码才能完成。这就是我个人不喜欢 java 的原因,它有时会使事情变得复杂。
对于引用类型,Arrays.sort 使用 Timsort,您可以填写一个比较器来自定义它。