Java ArrayIndexoutofbound异常合并两个排序数组

Java ArrayIndexoutofbound异常合并两个排序数组,java,Java,我见过其他解决方案,比如,我想知道我使用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}

我见过其他解决方案,比如,我想知道我使用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);
        }
    }
}

依赖两个具有相同长度的数组不是一个好主意,因此我不会使用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);
}
int[]mergedArray=newint[a1.length+a2.length];
对于(int i=0;i
代码中的问题是由于在第二个循环中将
i
用作
a2
的索引。它对
mergedArray
有效,但对
a2

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

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

for (int i= a1.length; i < 2 * (a1.length); i++) {
    mergedArray[i] = a2[i];
}
或在左侧添加
a1.长度

for (int i = 0; i < a1.length; i++) {
    mergedArray[i + a1.length] = a2[i];
}    
for(int i=0;i
选择更方便的选项。

错误(对于ArrayOutOfBoundException):

for(int i=a1.length;i<2*(a1.length);i++){
mergedArray[i]=a2[i];//错误地使用“i”访问a2[i]
}
更正以上内容:

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

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

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

for(int i= a1.length; i < 2 * (a1.length); i++)
    mergedArray[i] = a2[i];
如果仍然使用循环,只需使用另一个索引变量:

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

您错过了主要问题:
mergedArray[i]=a2[i](也在您的第一个代码示例中)将始终导致ArrayIndexOutOfBoundException。@Thomas Stets,谢谢。我删除了第一个片段,因为第二个片段是正确的。
    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]
    }
for(int i= a1.length; i < 2 * (a1.length); i++)
    mergedArray[i] = a2[i];
 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];