【问题标题】:Why am I getting an IndexOutOfBounds error when merging two arrays? [closed]为什么在合并两个数组时出现 IndexOutOfBounds 错误? [关闭]
【发布时间】:2015-08-12 15:05:45
【问题描述】:

我已经编写了在 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)

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

【问题讨论】:

  • 您的调试器可以帮助您。如果你急于让它工作,那么将所有元素放入 TreeSet 并读回内容。
  • 是的,我使用了调试器。一个数组在合并完成之前用完。我该如何处理这种情况?
  • length 返回 6,但您的索引从 0 开始
  • 你需要检查i &lt; my_array.lengthj &lt; alices_array.length
  • 我投票结束这个问题,因为它太本地化了。

标签: java arrays indexoutofboundsexception array-merge


【解决方案1】:

如果您超出了my_array 的结尾,则无法检查my_array[i] &lt; 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 不需要计算&amp;&amp; 表达式的后半部分。见Does Java evaluate remaining conditions after boolean result is known?


这个答案将帮助你解决这个问题,但你真的应该阅读这篇文章以更好地编程:

【讨论】:

    【解决方案2】:

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

    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++;
    }
    

    【讨论】:

    • 一个数组用完后就不需要手动复制另一个数组了。使用以本机代码实现的System.arraycopy(或Arrays 中的包装器),效率更高。
    【解决方案3】:

    你必须检查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++;
                }
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-11
      • 1970-01-01
      • 1970-01-01
      • 2019-10-05
      • 2014-08-30
      • 2022-08-05
      • 2021-01-13
      相关资源
      最近更新 更多