合并字符串获取空指针异常的排序?

时间:2015-05-17 21:03:05

标签: java mergesort

void MERGE(String[]A, int p, int q, int r)  {
    int n1 = q - p + 2;
    int n2 = r - q + 1;

    String[] L = new String[n1];
    String[] R = new String[n2];

    int i,j;

    for (i = 0; i < L.length; i++) {
        L[i] = A[p+i];
    }
    for (j = 0; i < R.length; j++) {
        R[j] = A[q+j+1];
    }

    L[n1-1] = "";
    R[n2-1] = "";

    i = 0;
    j = 0;

    for (int k = p; k <= r; k++) {
        if (L[i].compareToIgnoreCase(R[j]) < 0) {
            A[k] = L[i];
            i++;
        }
        else {
            A[k] = R[j];
            j++;
        }
    }
}
public void MERGE_SORT(String[] A, int p, int r) {

    if (p < r) {
        int q = (p+r)/2;

        MERGE_SORT(A, p, q);
        MERGE_SORT(A, q+1, r);
        MERGE(A, p, q, r);
    }

}

这个算法最初用于整数,这是我如何改变它来排序字符串。我得到一个NullPointerException。问题似乎是在compareToIgnoreCase()行。这甚至是你如何实现字符串的mergesort?  Console output

public static void main(String[] args) {
    String[] sA = {"Jack", "John", "Mike", "Moss", "Xo"};       
    Sort ob = new Sort();
    ob.MERGE_SORT(sA, 0, sA.length - 1);
}

1 个答案:

答案 0 :(得分:2)

方法MERGE中的第二个for循环使用错误的变量i(而不是j)来检查上限(i < R.length)。它应该是:

for (j = 0; j < R.length; j++) {
    R[j] = A[q+j+1];
}

除此之外,代码还有两个问题:

(1)用于初始化L和R的for循环应分别运行到L.length - 1 R.length - 1

for (i = 0; i < L.length - 1; i++) {
    L[i] = A[p + i];
}
for (j = 0; j < R.length - 1; j++) {
    R[j] = A[q + j + 1];
}

(2)你在L和R的最后一个位置使用了一个标记,以保证合并for循环永远不会超过数组。此标记应大于数组中可能的最大值。如果是int[],这可能是Integer.MAX_VALUE(这与最大可能元素一样大,但这可能是可以接受的)。但是,由于您拥有String数组,因此您需要尽可能大的String值。您正在使用空字符串(""),这是最小的String

L[n1 - 1] = "";
R[n2 - 1] = "";

对于测试,您可以使用类似"ZZZ"的内容,但是您应该重写合并算法,以便在没有哨兵的情况下工作:

L[n1 - 1] = "ZZZ";
R[n2 - 1] = "ZZZ";