我正在使用eclipse中的程序将数组拆分为两个大小相等的数组。我的程序编译,但是当我运行它时,我收到以下错误消息:
线程中的异常" main" java.lang.ArrayIndexOutOfBoundsException: mergeArrays.main上的10000(mergeArrays.java:28)
如果您对我收到此错误的原因有任何建议,我们将不胜感激。提前谢谢!
这是我的代码:
import java.util.Scanner;
import java.util.Random;
public class mergeArrays {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
//System.out.print("Enter an upper limit: ");
//int lim = input.nextInt();
int lim = 10000;
int halfLim;
halfLim = lim / 2;
//int data[];
//data = new int[lim];
double[] data = new double[lim];
for (int i = 0; i < lim; i++) {
data[i] = Math.random();
}
double[] a = new double[halfLim];
for (int i = 0; i < halfLim; i++) {
a[i] = data[i];
}
double[] b = new double[halfLim];
for (int i = halfLim; i < lim; i++) {
b[i] = data[i];
}
System.out.print(a);
}
}
答案 0 :(得分:0)
你的上一个迭代器是错误的
使用它:
for(int i = 0; i < lim ; ++i) {
b[i] = data[i+halfLim];
}
而不是:
for(int i = 0 ; i < halfLim ; ++i) {
b[i] = data[i+halfLim];
}
更优化的方法是组合两个循环:
for(int i = 0; i < halfLim ; ++i) {
a[i] = data[i];
b[i] = data[i+halfLim];
}
答案 1 :(得分:0)
自lim
&gt; halfLim
您访问了超出界限的元素
double[] b = new double[halfLim]; // your promise of halfLim
for(int i = halfLim ; i < lim ; ++i) {
b[i] = data[i+halfLim]; // did you betray?
}
答案 2 :(得分:0)
问题出现在以下循环中:
for(int i = halfLim ; i < lim ; ++i) {
b[i] = data[i+halfLim];
}
它应该是data[i]
而不是data[i+halfLim]
。这是因为您已将变量i
初始化为halfLim
的值,因此您只需从此值开始下半部分直到< lim
。
答案 3 :(得分:0)
for(int i = halfLim ; i < lim ; ++i) {
b[i] = data[i+halfLim];
}
在您的上一个for loop
中,在此循环的第一次迭代中,halflim = 5000
和i = 500
,以便生成i+halflim = 10000
,所以当您执行
b[i] = data[i+halfLim];
您正在尝试访问数组10000
的{{1}}索引,其中包含从data
到0
的索引,因此您获得了9999
。
代码中ArrayIndexOutOfBoundsException
的另一个原因是数组ArrayIndexOutOfBoundsException
的大小为b
,而在您的上一个5000
中,您正在将for loop
初始化为{ {1}}等于i
,因此halflim
= 5000
无效,因为b[i]
的大小为b[5000]
,这意味着它包含索引从b
到5000
。
答案 4 :(得分:0)
有两个问题需要解决。
首先,b[i]
不会成功索引任何内容。 b
的定义大小为5000,但您已将其设置为原始数组大小的一半。这将导致自己ArrayIndexOutOfBoundsException
。
其次,您需要确保只将一半元素添加到另一个数组中。起始位置因您的偏移量i + halfLim
而不同,但最终迭代次数仍必须达到最大尺寸的一半。
因此,您需要进行两项更改:
i
必须从0开始,halfLim
终止。执行此操作的代码如下:
for(int i = 0; i < halfLim ; ++i) {
b[i] = data[i+halfLim];
}
另外,请务必在顶部写上import java.util.Arrays;
,在要打印Arrays.toString(a)
时使用a
,否则您只会获得一个对象字符串参考。
答案 5 :(得分:0)
你的第二个for循环中有几个问题:
b
数组,其大小为半限,即5000
i
的初始值设置为halfLim(5000)
,此索引根本不存在,因为它太大data[i + halfLim]
- 当i的初始值设置为halfLim
时,您尝试访问index 5000 + 5000
处的元素,这也超出了数据数组的范围答案 6 :(得分:0)
b[i]
实际上是b[5000]
,它超出了界限。试试这个:
double[] b = new double[halfLim];
for(int i = 0 ; i < (lim/2) ; i++) {//i should be 0 to start inserting data at index zero
b[i] = data[halfLim];//Start collecting data from where you stopped
halfLim++;//increment halfLim to pick next data
}
System.out.println(Arrays.toString(data));
System.out.println(Arrays.toString(a));
System.out.println(Arrays.toString(b));
答案 7 :(得分:0)
您应该使用Java库,尤其是Arrays.copyOfRange(double[] original, int from, int to)
方法,而不是编写自己的循环。
实施例
double[] data = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int half = (data.length + 1) / 2; // Make first half larger if odd sized
double[] a = Arrays.copyOfRange(data, 0, half);
double[] b = Arrays.copyOfRange(data, half, data.length);
System.out.println(Arrays.toString(a));
System.out.println(Arrays.toString(b));
输出
[1.0, 2.0, 3.0, 4.0, 5.0]
[6.0, 7.0, 8.0, 9.0]