Java 中无法推断功能接口类型错误
Cannot infer functional interface type Error in Java
我正在使用 Java 来实现桶排序。我想对 [0.897, 0.565, 0.656, 0.1234, 0.665, 0.3434]
的输入数组进行排序,并将 buckets
创建为包含 List<Double>
作为元素的数组,我使用 List.sort
对每个 List<Double>
单独排序并将它们连接起来得到结果。
但是当我使用ArrayList.sort
方法对List
进行排序时出现错误。我使用 Lambda 表达式作为 sort
函数的参数,并从 IDE 得到一条错误消息,它说 Cannot infer functional interface type
.
错误来自这一行:
buckets[i].sort((double a, double b) -> (int)Math.signum(a-b));
但是当我把它改成
buckets[i].sort((a, b) -> (int)Math.signum(a-b));
没有错误,代码运行良好。
我很疑惑为什么不能推断?提前致谢。
完整代码在这里:
import java.util.ArrayList;
import java.util.List;
class Solution {
void buckerSort(double[] arr, int n){
//create the buckets
List<Double>[] buckets = new ArrayList[n];
for (int i = 0; i<n; ++i){
buckets[i] = new ArrayList<Double>();
}
//add the input to the buckets
for (int i=0; i<n; ++i) {
int index = (int) arr[i] * 10;
buckets[index].add(arr[i]);
}
//sort every List individually
///////////////////////////////The error occurs here/////////////////////////////////////////
for (int i=0; i<n; ++i) {
buckets[i].sort((double a, double b) -> (int)Math.signum(a-b));
}
//concatenate
int index = 0;
for(int i = 0; i<n; i++) {
for (int j = 0; j<buckets[i].size(); j++) {
arr[index] = buckets[i].get(j);
index++;
}
}
}
public static void main(String args[])
{
double[] arr = {0.897, 0.565, 0.656, 0.1234, 0.665, 0.3434};
int n = arr.length;
Solution s = new Solution();
s.buckerSort(arr, n);
System.out.println("Sorted array is: ");
for (int i = 0; i < n; ++i) {
System.out.print(arr[i] + " ");
}
}
}
您可以使用
buckets[i].sort( ( Double a, Double b ) -> (int) Math.signum( a - b ) );
相反,因为 Double
的 Comparator
接受两个 Double
类型参数而不是原始 double
参数。
public int compare( Double a, Double b )
更重要的是,您可能只是希望使用 Comparator.naturalOrder()
自然地对元素进行排序,因为执行减法并不是比较元素的好方法。所以你的代码看起来像 -
buckets[i].sort( Comparator.naturalOrder() );
我正在使用 Java 来实现桶排序。我想对 [0.897, 0.565, 0.656, 0.1234, 0.665, 0.3434]
的输入数组进行排序,并将 buckets
创建为包含 List<Double>
作为元素的数组,我使用 List.sort
对每个 List<Double>
单独排序并将它们连接起来得到结果。
但是当我使用ArrayList.sort
方法对List
进行排序时出现错误。我使用 Lambda 表达式作为 sort
函数的参数,并从 IDE 得到一条错误消息,它说 Cannot infer functional interface type
.
错误来自这一行:
buckets[i].sort((double a, double b) -> (int)Math.signum(a-b));
但是当我把它改成
buckets[i].sort((a, b) -> (int)Math.signum(a-b));
没有错误,代码运行良好。
我很疑惑为什么不能推断?提前致谢。
完整代码在这里:
import java.util.ArrayList;
import java.util.List;
class Solution {
void buckerSort(double[] arr, int n){
//create the buckets
List<Double>[] buckets = new ArrayList[n];
for (int i = 0; i<n; ++i){
buckets[i] = new ArrayList<Double>();
}
//add the input to the buckets
for (int i=0; i<n; ++i) {
int index = (int) arr[i] * 10;
buckets[index].add(arr[i]);
}
//sort every List individually
///////////////////////////////The error occurs here/////////////////////////////////////////
for (int i=0; i<n; ++i) {
buckets[i].sort((double a, double b) -> (int)Math.signum(a-b));
}
//concatenate
int index = 0;
for(int i = 0; i<n; i++) {
for (int j = 0; j<buckets[i].size(); j++) {
arr[index] = buckets[i].get(j);
index++;
}
}
}
public static void main(String args[])
{
double[] arr = {0.897, 0.565, 0.656, 0.1234, 0.665, 0.3434};
int n = arr.length;
Solution s = new Solution();
s.buckerSort(arr, n);
System.out.println("Sorted array is: ");
for (int i = 0; i < n; ++i) {
System.out.print(arr[i] + " ");
}
}
}
您可以使用
buckets[i].sort( ( Double a, Double b ) -> (int) Math.signum( a - b ) );
相反,因为 Double
的 Comparator
接受两个 Double
类型参数而不是原始 double
参数。
public int compare( Double a, Double b )
更重要的是,您可能只是希望使用 Comparator.naturalOrder()
自然地对元素进行排序,因为执行减法并不是比较元素的好方法。所以你的代码看起来像 -
buckets[i].sort( Comparator.naturalOrder() );