我在合并排序算法上有以下代码。在一段时间内没有使用过Java,我完全忘记了如何正确调用MergeSort方法,以便命令一些指定的数组。目前,MergeSort(A)
抛出错误(因为MergeSort方法是通用的?)。它告诉我,我应该将我的MergeSort签名改为MergeSort(int[] A)
。任何帮助将不胜感激!
public static void main(String[] args){
int[] A = {4,7,9,2,3,3,0,1};
System.out.println(Arrays.toString(A));
MergeSort(A);
}
public static <T extends Comparable<T>> void MergeSort(T[] A){
MergeSort(A, 0, A.length - 1);
}
private static <T extends Comparable<T>> void MergeSort(T[] A, int p, int r){
if(p < r){
int q = (p + r)/2;
MergeSort(A,p,q);
MergeSort(A,q + 1, r);
merge(A,p,q,r);
}
}
private static <T extends Comparable<T>> void merge(T[] A, int p, int q, int r){
T[] temp = (T[])(new Comparable[A.length]);
int first1 = p, last1 = q;
int first2 = q + 1, last2 = r;
int index = first1;
while(first1 <= last1 && first2 <= last2){
if(A[first1].compareTo(A[first2]) < 0){
temp[index] = A[first1];
first1++;
} else {
temp[index] = A[first2];
first2++;
}
index++;
}
while(first1 <= last1){
temp[index] = A[first1];
first1++; index++;
}
while(first2 <= last2){
temp[index] = A[first2];
first2++; index++;
}
for(index = p; index <= r; index++){
A[index] = temp[index];
}
}
答案 0 :(得分:1)
此错误是因为int
是基元,并且基元数组不能用作通用数组。
您可以做的是使用相应的包装类型Integer
。将数组声明为
Integer[] A = {4,7,9,2,3,3,0,1};
它会正常工作。
答案 1 :(得分:1)
您的方法是:
public static <T extends Comparable<T>> void MergeSort(T[] A)
忽略变量的命名,我将在最后讨论,你需要一个T
数组T extends Comparable<T>
。
你有int[] A
。由于int
是原始的,不能extends
任何东西,所以这不可行。您需要Integer[]
:
Integer[] A = {4,7,9,2,3,3,0,1};
我还要指出,除非这是一次学术练习,否则Java API中的Arrays
实用程序类具有许多不同的sort()
方法,正是出于这个原因,包括one for int[]
。
现在,命名。
在Java中,使用camelCase
作为变量是公认且强烈鼓励的惯例;类PascalCase
和编译时常量BLOCK_CAPS
。请更改您的代码以遵守,因为这样做非常难以阅读。此外,它在SO上搞砸了自动语法高亮。
答案 2 :(得分:0)
正如JLS所述:
Every type variable declared as a type parameter has a bound.
If no bound is declared for a type variable, Object is assumed.
因为您传递了一个基本类型,它将生成编译时错误,方法MergeSort
期望type variable
而不是primitive type
。
<强>溶液强>
您可以使用整数原语的包装类Integer
。
Integer[] A = {4,7,9,2,3,3,0,1};