将数组拆分为两个大小相等的数组

时间:2017-02-03 19:45:53

标签: java arrays eclipse

我正在使用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);
    }
}

8 个答案:

答案 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 = 5000i = 500,以便生成i+halflim = 10000,所以当您执行

b[i] = data[i+halfLim];

您正在尝试访问数组10000的{​​{1}}索引,其中包含从data0的索引,因此您获得了9999

代码中ArrayIndexOutOfBoundsException的另一个原因是数组ArrayIndexOutOfBoundsException的大小为b,而在您的上一个5000中,您正在将for loop初始化为{ {1}}等于i,因此halflim = 5000无效,因为b[i]的大小为b[5000],这意味着它包含索引从b5000

答案 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]