System.arraycopy 返回 ArrayIndexOutOfBoundsException 错误

3

今天我学习了Java中的arraycopy()函数,并在代码中使用它。但是我一直得到ArrayOutOfBoundsException异常。我尝试找出解决方法并在谷歌上搜索解决方案,但似乎无法解决。如果有人能看一下就很有帮助了。

System.arraycopy(a, 0, b, 1, N + 1);

在这里,“a”是长度为“N”的数组,b是另一个长度为“N+1”的数组。我想以这样的方式将数组“a”的所有元素复制到数组“b”中,即所有数组“a”的元素都从数组“b”的第二个索引开始,为数组“b”中的另一个元素留出空间。

如果需要,下面是整个代码:

import java.util.Random;
import java.util.Scanner;

public class JavaApplication24 {

public static long DC;
public static long DM1;
public static long DM;

private static int[] Insrtn_sort(int[] a, int N) {

    int t, i;
    int b[] = new int[N + 1];
    DC = 0;
    DM = 0;
    DM1 = 0;

    b[0] = Integer.MIN_VALUE;
    System.arraycopy(a, 0, b, 1, N + 1);

    for (int j = 1; j < N + 1; j++) {
        t = b[j];
        i = j - 1;
        while (t < b[i]) {
            b[i + 1] = b[i];
            i--;
            DC++;
            DM1++;
        }
        b[j + 1] = t;
        DM++;
    }

    return b;
}

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    Random r = new Random();
    float StartTime, EndTime, TotalTime;

    int N = sc.nextInt();
    int[] a = new int[N];
    for (int i = 0; i <= N - 1; i++) {
        a[i] = r.nextInt();
    }

    StartTime = System.currentTimeMillis() / 1000;
    Insrtn_sort(a, N);
    EndTime = System.currentTimeMillis() / 1000;

    TotalTime = StartTime - EndTime;

    for (int i = 1; i <= N - 1; i++) {
        System.out.println(a[i]);
    }
    System.out.println("Time taken for sorting: " + TotalTime);
    System.out.println("Total number of data comparisons: " + DC);
    System.out.println("Total number of data movements: " + DM + DM1);

}

}

请提供完整的代码以便我们帮助您。 - Fady Saad
尝试阅读该方法的Javadoc文档了吗? - GhostCat
FYI,i <= N - 1 相当于更短更常规的 i < N - shmosel
2个回答

3

你的a数组索引从0到[N-1],长度为(N),而b数组索引从0到N,长度为(N+1),那么你必须写成System.arraycopy(a, 0, b, 1, N);


2

请查看 System.arraycopy 源码中 @param length 的含义:

@param length 要复制的数组元素数量。

因此,N+1 必须等于 N,其中 N 是您想要复制的数量,就像数组 "a" 的长度一样。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接