英文:
Cannot infer functional interface type Error in Java
问题
我使用Java来实现桶排序。我想要对输入数组 [0.897, 0.565, 0.656, 0.1234, 0.665, 0.3434]
进行排序,并创建了一个包含 List<Double>
元素的 buckets
数组,我分别使用 List.sort
对每个 List<Double>
进行排序,然后将它们连接起来得到结果。
但是,当我使用 ArrayList.sort
方法对 List
进行排序时出现了错误。我将 Lambda 表达式作为 sort
函数的参数,并从IDE中得到了一个错误消息,它说 无法推断函数接口类型
。
错误出现在这一行:
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 bucketSort(double[] arr, int n) {
// 创建桶
List<Double>[] buckets = new ArrayList[n];
for (int i = 0; i < n; ++i) {
buckets[i] = new ArrayList<Double>();
}
// 将输入添加到桶中
for (int i = 0; i < n; ++i) {
int index = (int) (arr[i] * 10);
buckets[index].add(arr[i]);
}
// 分别对每个列表排序
for (int i = 0; i < n; ++i) {
buckets[i].sort((a, b) -> (int) Math.signum(a - b));
}
// 连接桶中的元素
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.bucketSort(arr, n);
System.out.println("排序后的数组是:");
for (int i = 0; i < n; ++i) {
System.out.print(arr[i] + " ");
}
}
}
英文:
I'm using Java to implement the Bucket Sorting. I want to sort the input array of [0.897, 0.565, 0.656, 0.1234, 0.665, 0.3434]
and I create the buckets
as an array containing List<Double>
as it's elements, I sort every List<Double>
individually using List.sort
and concatenate them to get the result.
But Error occurs when I use the ArrayList.sort
method to sort the List
. I use a Lambda Expression as the parameter of the sort
function and get an error message from the IDE, it says Cannot infer functional interface type
.
The error comes from this line:
buckets[i].sort((double a, double b) -> (int)Math.signum(a-b));
But when I change it to
buckets[i].sort((a, b) -> (int)Math.signum(a-b));
there is no error and the code works well.
I am very confused why it can't infer? Thanks in advance.
The entire code is here:
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] + " ");
}
}
}
答案1
得分: 2
你可以使用以下方式:
buckets[i].sort((Double a, Double b) -> (int) Math.signum(a - b));
因为Double
类型的Comparator
接受两个Double
类型的参数,而不是原始的double
类型参数。
更重要的是,你可能只是想要使用Comparator.naturalOrder()
自然排序元素,因为执行减法并不是比较元素的好方法。所以你的代码会像这样:
buckets[i].sort(Comparator.naturalOrder());
英文:
You can use
buckets[i].sort( ( Double a, Double b ) -> (int) Math.signum( a - b ) );
instead, since a Comparator
of Double
accepts two Double
type arguments and not primitive double
arguments.
public int compare( Double a, Double b )
More importantly, you might just be looking to sort the elements naturally using Comparator.naturalOrder()
as performing a subtraction isn't a good way of comparing elements. So your code would look like -
buckets[i].sort( Comparator.naturalOrder() );
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论