我试图通过Callable将函数作为函数的参数。当您尝试运行它时,它会说错误' void'这里不允许输入 long a = timer(sort.Insertion(A));
为什么?
import java.util.*;
import java.util.concurrent.*;
import java.io.*;
public class ThisClass {
public static Sort sort = new Sort();
public static void main(String[] args) throws FileNotFoundException {
Scanner scanner = new Scanner(new File("location/here.txt"));
int z = 0;
while(scanner.hasNextInt()) {
z++;
}
int[] A = new int[z];
for(int i = 0; i < A.length; i++) {
A[i] = scanner.nextInt();
System.out.print(" " + A[i]);
}
long a = timer(sort.Insertion(A));
}
public long timer (Callable func) throws Exception {
long start = System.currentTimeMillis();
func.call();
long end = System.currentTimeMillis();
return end - start;
}
public static void print (int[] A) {
for(int i = 0; i < A.length; i++) {
System.out.print(" " + A[i]);
}
}
}
import java.util.ArrayList;
public class Sort {
public void Insertion (int[] A) {
for(int j = 1; j < A.length; j++) {
int key = A[j];
int i = j - 1;
while((i >= 0) && (A[i] > key)) {
A[i + 1] = A[i];
i = i - 1;
}
A[i + 1] = key;
}
}
}
PS。如果有人可以帮助其他方法在Java中使用高阶有序函数,或者将函数作为函数中的参数传递,那就太好了。非常感谢。
答案 0 :(得分:1)
错误消息是Sort.Insertion()
有void
返回类型。
如果您尝试在计时器上调用它,则需要将其包装在Callable
中,如此(未经测试):
long a = timer(new Callable<Void>() {
Void call() {
sort.Insertion(A);
return null;
}
});
这需要A
final
。根据需要更改Void
。