Java 对泛型类型的数组进行排序

Java 对泛型类型的数组进行排序,java,generics,casting,Java,Generics,Casting,我试图在遗传类型的数组上实现合并排序算法。问题是结果不正确,因为某些元素被设置为0。我怀疑这个问题来自我在整个节目中的角色扮演,但我不知道确切的原因 正如您在sortUsingMerge()中看到的,我将一个对象数组强制转换为泛型。同样在下面的IF语句中,我将数组中的Object元素强制转换为int,以便能够比较2个元素。我的意图是排序算法应该适用于任何类型的任何数组,但我现在不想为每种类型编写比较器 Input array: 5 1 -2 3 7 8 0 Output: -2 0 1 1 3

我试图在遗传类型的数组上实现合并排序算法。问题是结果不正确,因为某些元素被设置为0。我怀疑这个问题来自我在整个节目中的角色扮演,但我不知道确切的原因

正如您在sortUsingMerge()中看到的,我将一个对象数组强制转换为泛型。同样在下面的IF语句中,我将数组中的Object元素强制转换为int,以便能够比较2个元素。我的意图是排序算法应该适用于任何类型的任何数组,但我现在不想为每种类型编写比较器

Input array: 5 1 -2 3 7 8 0
Output: -2 0 1 1 3 7 0
看起来5号和8号在排序过程中被转换成了不同的数字。有人能告诉我为什么吗?谢谢

Source code:

public void sortUsingMerge(){
    Object[] array = (E[]) new Object[size];
    Object[] helper = (E[]) new Object[size];

    mergeSort(array,helper,0,size-1);

}
 public void mergeSort(Object[] array, Object[] helper, int low, int high){

       if (low<high){ 

            int mid = (low + high)/2;

            mergeSort(array,helper,low,mid); //sort left half
            mergeSort(array,helper,mid+1,high);//sort right half
            merge(array,helper,low,mid,high);

        }
}
public void merge(Object[] array, Object[] helper, int low, int mid, int high){

    for (int i=low; i<=high; i++){// copy both parts into helper array
        helper[i] = array[i];
    }

    int helperLeft = low;
    int helperRight = mid + 1;
    int current = low;

    while (helperLeft <= mid && helperRight <=high){

        if ((int)helper[helperLeft] <= (int)helper[helperRight]){
            array[current] = helper[helperLeft];
            helperLeft++;
        }
        else{
            array[current] = helper[helperRight];
            helperRight++;
        }

        current++;
    }


    int remain = mid - helperLeft;
    for (int i=0; i<remain; i++){
        array[current+i] = helper[helperLeft + i];
    }


}
源代码:
公共无效sortUsingMerge(){
Object[]数组=(E[])新对象[size];
Object[]helper=(E[])新对象[size];
合并排序(数组,助手,0,大小为1);
}
公共void合并排序(对象[]数组、对象[]辅助对象、整型低、整型高){

if(lowCasting不会给你这种错误。你在合并结束时有bug

    int remain = mid - helperLeft;
    for (int i=0; i <= remain; i++) {                 //changed < to <=
        array[current+i] = helper[helperLeft + i];
    }
int remain=mid-helperLeft;

for(inti=0;i强制转换永远不会给你这种错误。你在合并结束时有bug

    int remain = mid - helperLeft;
    for (int i=0; i <= remain; i++) {                 //changed < to <=
        array[current+i] = helper[helperLeft + i];
    }
int remain=mid-helperLeft;
对于(int i=0;i内部合并替换

    for (int i=0; i<remain; i++){
     array[current+i] = helper[helperLeft + i];
    }
用于(int i=0;i内部合并替换

    for (int i=0; i<remain; i++){
     array[current+i] = helper[helperLeft + i];
    }

for(int i=0;i使用调试器。编写一些测试。由于没有进行“深度”测试,您似乎正在丢失数字复制左数组和右数组。只需原地修改。按照mitch的建议进行操作并调试。如果要在逻辑中将数组元素强制转换为
int
,为什么要使用泛型?我的目的是对任何类型的元素进行排序。但是,我想先快速检查它是否适用于整数。没有cast、 我无法将一个E与另一个E进行比较。请使用调试器。编写一些测试。如果您没有进行“深度”测试,则可能会丢失数字复制左数组和右数组。只需原地修改。按照mitch的建议进行操作并调试。如果要在逻辑中将数组元素强制转换为
int
,为什么要使用泛型?我的目的是对任何类型的元素进行排序。但是,我想先快速检查它是否适用于整数。没有cast、 我无法将一个E与另一个E进行比较。出于多种原因,此处不建议使用仅链接的答案。请在此处为特定问题提供一个实际、简洁的答案。@b已放置了一个简洁的答案。它修复了问题。我没想到问题来自算法本身:)谢谢!由于多种原因,此处不鼓励使用仅链接的答案。请在此处为特定问题提供实际、简洁的答案。@b已放置Ares简明答案。它修复了问题。我没想到问题来自算法本身:)谢谢!我相信第二个for循环是不必要的,因为最大的元素总是移动到原始数组的右端。我相信第二个for循环是不必要的,因为最大的元素总是移动到原始数组的右端。