为什么在合并两个数组时会出现 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++;
}
您必须检查 i
和 j
的范围,以防到达终点。
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++;
}
}
我编写了代码来合并 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++;
}
您必须检查 i
和 j
的范围,以防到达终点。
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++;
}
}