Java ArrayIndexoutofbound异常合并两个排序数组
我见过其他解决方案,比如,我想知道我使用for循环的方法是否有任何问题。我不想像其他人在解决方案中使用的那样使用while循环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}
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];