有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我正在eclipse中编写一个程序,将一个数组拆分为两个大小相等的数组。我的程序可以编译,但运行时会收到以下错误消息:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 10000 at mergeArrays.main(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);
    }
}

共 (6) 个答案

  1. # 1 楼答案

    在第二个for循环中有两个问题:

    • 您使用大小为5000的半限制初始化了b数组
    • i的初始值设置为halfLim(5000),该索引根本不存在,因为它太大了
    • data[i + halfLim]-当i的初始值设置为halfLim时,您试图访问index 5000 + 5000处的元素,这也超出了数据数组的范围
  2. # 2 楼答案

    lim>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?
    }
    
  3. # 3 楼答案

    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));
    
  4. # 4 楼答案

    您的最后一个迭代器是错误的

    使用以下命令:

    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];
    }
    
  5. # 5 楼答案

    有两个问题需要解决

    首先,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;,并在要打印a时使用Arrays.toString(a),否则您将只获得一个对象字符串引用

  6. # 6 楼答案

    问题在以下循环中:

     for(int i = halfLim ; i < lim ; ++i) {
        b[i] = data[i+halfLim];
     }
    

    它应该是data[i]而不是data[i+halfLim]。这是因为您已经将变量i初始化为halfLim的值,所以您只需从该值开始下半部分,直到< lim