为什么在合并两个数组时会出现 IndexOutOfBounds 错误?

Why am I getting an IndexOutOfBounds error when merging two arrays?

我编写了代码来合并 Java 中的两个排序数组。

public class MergeSortedArrays {
    public static int[] my_array     = {3, 4, 6, 10, 11, 15};
    public  static int[] alices_array = {1, 5, 8, 12, 14, 19};
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int length = my_array.length + alices_array.length;

        int[] new_array = new int[length];
        int i = 0;
        int j = 0;
        int count = 0;

        while (count < length) {

            if(my_array[i] < alices_array[j] ) {
                new_array[count] = my_array[i];
                i++;
            } else {
                new_array[count] = alices_array[j];
                j++;
            }

            count++;
        }
        for(int k=0;k<length;k++) {
            System.out.println(new_array[k]);
        }
    }

}

但是我收到这个错误-

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 6
    at MergeSortedArrays.main(MergeSortedArrays.java:15)

一个数组在合并完成之前就已经用完了。我该如何处理这种情况?

如果您超过了 my_array,则无法检查是否 my_array[i] < alices_array[j]。所以确保 i 有效;如果不是,请从 j 添加一个元素。同样,您不想检查 j 是否超过了该数组的末尾。因此,使用此检查代替您之前的 if 语句:

if(j >= alices_array.length || 
       (i < my_array.length && my_array[i] < alices_array[j] )) {

它不尝试计算 my_array[i] 的原因是因为如果前半部分为假,Java 不需要计算 && 表达式的后半部分。参见 Does Java evaluate remaining conditions after boolean result is known?


这个答案将帮助您解决这个问题,但是您应该真正阅读这篇文章以提高编程水平:

问题是,当一个数组完成后,你应该只考虑另一个:

while (count < length) {
    if (i == my_array.length) {
        new_array[count] = alices_array[j];
        j++;
    } else if (j == alices_array.length) {
        new_array[count] = my_array[i];
        i++;
    } else {
        if(my_array[i] < alices_array[j] ) {
            new_array[count] = my_array[i];
            i++;
        } else {
            new_array[count] = alices_array[j];
            j++;
        }
    }
    count++;
}

您必须检查 ij 的范围,以防到达终点。

        if (i < my_array.length) {
            if (j < alices_array.length) {
                if (my_array[i] < alices_array[j]) {
                    new_array[count] = my_array[i];
                    i++;
                } else {
                    new_array[count] = alices_array[j];
                    j++;
                }

            } else {
                new_array[count] = my_array[i];
                i++;
            }
        } else {
            if (j < alices_array.length) {
                new_array[count] = alices_array[j];
                i++;
            }
        }