【问题标题】:ArrayIndexoutofbound exception merging two sorted arrayArrayIndexoutofbound 异常合并两个排序数组
【发布时间】:2015-12-15 03:19:12
【问题描述】:

我见过其他解决方案,例如 this,我想知道我使用 for 循环的方法是否有问题。我不想像其他人在他们的解决方案中使用的那样使用 while 循环。

package com.my.practice;

public class MedianOfTwoArrays {

    public static void main(String[] args) {
        // Given two sorted arrays of same size

        int[] a1 = {1,2,3,4,5,6};
        int[] a2 = {7,8,9,10,11,12};        

        int[] mergedArray = new int[a1.length + a2.length];

        for(int i=0 ; i < a1.length; i++){
            mergedArray[i] = a1[i];
        }

        //System.out.println("Length:"+2*(a1.length));

        for(int i= a1.length; i < 2 * (a1.length); i++) {
            mergedArray[i] = a2[i];
        }

        for(int i=0 ; i < 2*(a1.length); i++){          
            System.out.println("Part of Array: "+mergedArray[i]+ " Length is: "+mergedArray.length);
        }
    }
}

我收到以下错误:

Length:12
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 6
    at com.my.practice.MedianOfTwoArrays.main(MedianOfTwoArrays.java:30)

【问题讨论】:

    标签: java


    【解决方案1】:

    依赖两个长度相同的数组不是一个好主意,所以我不会使用a1.length * 2。另外,你不能对原始数组和合并数组使用相同的索引, 因为合并后的数组更长。

    建议的修复:

    int[] mergedArray = new int[a1.length + a2.length];
    
    for(int i=0 ; i < a1.length; i++){
        mergedArray[i] = a1[i];
    }
    
    for(int i= 0 ; i < a2.length; i++){
        mergedArray[a1.length + i] = a2[i];
    }
    
    for(int i=0 ; i < mergedArray.length; i++){
        System.out.println("Part of Array: "+mergedArray[i]+ " Length is: "+mergedArray.length);
    }
    

    【讨论】:

    • 您错过了主要问题:mergedArray[i] = a2[i];(也在您的第一个代码示例中)将始终导致 ArrayIndexOutOfBoundException。
    • @Thomas Stets 谢谢。我删除了第一个 sn-p,因为第二个 sn-p 是正确的。
    【解决方案2】:

    代码中的问题是由于在第二个循环中使用i 作为a2 的索引。它对mergedArray 有效,但对a2 无效

    在第二个循环中使用i-a1.length 作为索引

    for(int i= a1.length; i < 2 * (a1.length); i++) {
        mergedArray[i] = a2[i-a1.length];
    }
    

    或者使用三个索引:ij & k。只是给你一个想法

    int i, j, k = 0;
    
    for (i = 0; i<a1.length; i++){
        mergedArray[k] = a1[i];
        k++;
    }
    
    for (j=0; j<a2.length; j++){
        mergedArray[k] = a2[j];
        k++;
    }
    

    【讨论】:

      【解决方案3】:

      问题是您对不同长度的数组使用相同的索引:

      for(int i= a1.length; i < 2 * (a1.length); i++)
          mergedArray[i] = a2[i];
      

      这里最初,i = 6a2 的数组边界是 0-5,但是 a2[i]a2[6],超出范围,这给了你例外。

      您可以使用 System.arraycopy() 跳过这些循环

       System.arraycopy(a1, 0, mergedArray,0, a1.length);
       System.arraycopy(a2, 0, mergedArray,a1.length, a2.length);
      

      如果你仍然想使用循环,只需使用另一个索引变量:

      for(int i = 0, j = a1.length; i < (a2.length); i++, j++)
          mergedArray[j] = a2[i];
      

      【讨论】:

        【解决方案4】:

        错误(对于 ArrayOutOfBoundException):

            for(int i= a1.length; i < 2 * (a1.length); i++) {
                mergedArray[i] = a2[i];  //Using 'i' incorrectly to access a2[i]
            }
        

        以上更正:

            for(int i= 0; i < a2.length; i++) {
                mergedArray[i+a1.length] = a2[i];  //Using 'i' incorrectly to access a2[i]
            }
        

        原因:

        • 这里的'i'将确保a2不会超出其大小,因为i的最大限制是a2.length。
        • 不要假设 a2 和 a1 的大小相等。遍历 a1 时使用 a1.length,遍历 a2 时使用 a2.length。
        • 可以添加安全(冗余)检查以确保 (i+a1.length) 不超过 mergeArray 大小。在这种情况下是冗余的,因为 mergeArray 的长度 = a1.size + a2.size。

        【讨论】:

          【解决方案5】:

          在这一行:

          for (int i= a1.length; i < 2 * (a1.length); i++) {
              mergedArray[i] = a2[i];
          }
          

          您正在尝试从 6 到 11 访问 ia2[i]。由于 a2 是一个大小为 6 的数组,a2[6]a2[7] ... a2[11] 不存在。

          在您的情况下,您希望将值 a2[1] 插入 mergedArray[6],将 a2[2] 插入 mergedArray[7] 等。

          您要么需要在右侧减去a1.length

          for (int i = a1.length; i < 2 * (a1.length); i++) {
              mergedArray[i] = a2[i - a1.length];
          }
          

          或在左侧添加a1.length

          for (int i = 0; i < a1.length; i++) {
              mergedArray[i + a1.length] = a2[i];
          }    
          

          选择更方便的。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-06-29
            • 2021-10-11
            • 1970-01-01
            相关资源
            最近更新 更多