MergeSort实现上的ClassCastException

时间:2017-12-31 09:50:31

标签: java mergesort

我正在实施MergeSort算法,但在从ClassCastException转换时,我总是得到Object。 为了比较K的两个值,我使用了intValue方法。有没有其他方法来比较它们?

import java.util.Arrays;
public class MergeSort {
    private static <K extends Number> K[] sort(K[] s) {
        int n = s.length;
        if (n == 0 || n == 1)
            return null;
        int mid = n / 2;
        if (n % 2 == 0) {
            K[] s1 = (K[]) new Object[n / 2];
            K[] s2 = (K[]) new Object[n / 2];
            for (int i = 0; i < n / 2; i++) {
                s1[i] = s[i];
                s2[i] = s[i + n / 2];
            }
            return merge(sort(s1), sort(s2));
        } else {
            K[] s1 = (K[]) new Object[n / 2];
            K[] s2 = (K[]) new Object[n / 2 + 1];
            for (int i = 0; i < n / 2; i++) {
                s1[i] = s[i];
                s2[i] = s[i + n / 2];
            }
            s2[n / 2] = s[n - 1];
            return merge(sort(s1), sort(s2));
        }
    }

    private static <K extends Number> K[] merge(K[] s1,K[] s2){
        int ll, rl;
        ll = s1.length;
        rl = s2.length;
        K[] merge = (K[]) new Object[ll+rl];
        int i = 0, j = 0;
        while (i + j < ll + rl) {
            if (j == rl || (i < ll && (s1[i].intValue() < s2[j].intValue())))
                merge[i + j] = s1[i++];
            else
                merge[i + j] = s1[j++];
        }
        return merge;
    }
}

1 个答案:

答案 0 :(得分:0)

关于例外:

您正在sort方法中创建 Object 的数组,然后将其转换为 K

但是像这样投射一个数组并没有神奇地将对象变成K个实例。你在这里使用泛型的全部想法并没有意义。尝试首先对Number数组进行排序。

并且:通常你会创造这些&#34; temp&#34;数组仅在合并步骤中。第一次分区数据的临时数组看起来也像是浪费内存。