请告诉我为什么编译器会给出错误:
“索引 -1 超出长度 2 的范围”
如何修复它?
这是代码:
public void merge(int[] nums1, int m, int[] nums2, int n) {
if (m == 0) {
System.out.println("Обратите внимание, что поскольку m = 0, в nums1 нет элементов. 0 присутствует только для того, чтобы результат слияния мог поместиться в nums1.");
}
ArrayList<Integer> w1 = new ArrayList<>();
ArrayList<Integer> w2 = new ArrayList<>();
if (nums2.length == 0) {
System.out.println(Arrays.toString(new String[]{Arrays.toString(nums1)}));
} else {
for (int el : nums1) {
w1.add(el);
}
int r = nums1.length;
for (int i = m; w1.size() != m; i++) {
w1.removeLast();
}
for (int el : nums2) {
w2.add(el);
}
int z = nums1.length;
for (int i = n; w2.size() != n; i--) {
w2.remove(i - 1);
}
Collections.sort(w1);
Collections.sort(w2);
System.out.println(w1.toString());
System.out.println(w2.toString());
}
}
编译器无法抛出指定的错误,因为它发生在程序执行期间。
从代码来看,它发生在
w2.remove(i - 1);从列表中删除某些元素时的行中w2,因为循环变量正在快速减少,并且没有检查循环中的i条件。i > 0所提供代码中的其他问题:
r初始化z,但不在任何地方使用。m不会n映射到相应数组的大小nums1,nums2因为它们可以超过数组的大小。w1,w2由于某种原因,数组的内容被完全复制nums1,nums2然后循环开始从列表末尾w1和列表开头删除元素w2- 立即复制所需数量的元素会容易得多merge和有关某个合并的消息文本,但该方法最多只会打印两个排序列表w1和的内容w2。更正后的代码可能如下所示:
一般来说,Stream API 适合这种转换,允许您以更简洁和声明式的风格实现所需的功能。
实施示例: