我编写了用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)
在合并完成之前,一个阵列已耗尽。我怎么处理这个案子?
答案 0 :(得分:1)
如果您已超过my_array[i] < alices_array[j]
的结尾,则无法检查是否my_array
。因此,请确保i
有效;如果不是,请添加j
中的元素。同样,如果j
超过该阵列的末尾,您也不想查看if(j >= alices_array.length ||
(i < my_array.length && my_array[i] < alices_array[j] )) {
。因此,请使用此检查而不是之前的if语句:
my_array[i]
它没有尝试评估&&
的原因是因为如果前半部分为假,Java不需要评估"window": {
"toolbar": false
, "width": 800
, "height": 600
, "min_width": 800
, "min_height": 600
}
表达式的后半部分。见Does Java evaluate remaining conditions after boolean result is known?
这个答案将帮助您解决这个问题,但您应该真正阅读本文,以便更好地进行编程:
答案 1 :(得分:1)
问题是,当一个数组完成时,你应该只考虑另一个数组:
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++;
}
答案 2 :(得分:0)
如果到达目的地,您必须检查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++;
}
}