如何在Java中正确调用方法

时间:2014-08-09 07:38:34

标签: java merge

我在合并排序算法上有以下代码。在一段时间内没有使用过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];
    }
}

3 个答案:

答案 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};