如何在不使用数组列表 (java) 的情况下调整多维数组的大小



>我需要将数组的大小从 w[i][j][q][k] 重置为 w[i+2][j+2][q][k]。我不想使用列表数组,因为我必须更改程序的大部分内容。我在某些线程中读到可以创建一个所需大小的新数组,并使用java.lang.System.arraycopy(...)将内容从原始数组复制到新数组。

按如下方式尝试了此操作,但它不适用于我的方法:

 int [][][][] w = new int [18][18][[Main.V+1][Main.k]; 
 (...)
 int[][][][] wNew = new int[20][20][Main.V+1][Main.k]; 
 for(int i=0; i<wNew.length; i++){
        for(int j=0; j<wNew[0].length; j++){
            for(int q=0; q<wNew[0][0].length; q++){
                for(int k=0; k<wNew[0][0][0].length; k++){
                    System.arraycopy(w, 0, wNew, 0, 18);
                }
            }
        }
    }
w = wNew;
(...)

在添加的位置操作数组时,会出现 java.lang.ArrayIndexOutOfBoundsException: 18(示例如下:

w[0][19][1][0] = 1; (this line now causes an error)

System.arraycopy(w, 0, wNew, 0, 20);

此 20 是要复制的数组元素的数量。您已经放置了新尺寸,使用旧尺寸。在您的示例中,它是 18。

其次,您的 for 循环基于您的新大小。这是向后的,您必须读取原始数组并插入到新数组中,因此您必须迭代原始数组大小(为了调整大小,当然要使其更小,则相反)。

但更重要的是,您不必迭代所有尺寸。我将向您介绍一些您可以执行的代码,以便您自己查看。

import java.util.Arrays; import java.util.Random;

public class Test {
    public static final int SIZE_DIM1 = 2;
    public static final int SIZE_DIM2 = 2;
    public static final int SIZE_DIM3 = 5;
    public static final int SIZE_DIM4 = 5;
    private static final int INCREMENT = 2;
    public static void main(String[] args) {
        int[][][][] w = new int[SIZE_DIM1][SIZE_DIM2][SIZE_DIM3][SIZE_DIM4];
        randomFill(w);
        display(w);
        int[][][][] wNew = new int[SIZE_DIM1 + INCREMENT][SIZE_DIM2 + INCREMENT][SIZE_DIM3][SIZE_DIM4];
        for (int i = 0; i < w.length; i++) {
            for (int j = 0; j < w[i].length; j++) {
                System.arraycopy(w[i][j], 0, wNew[i][j], 0, w[i][j].length);
            }
        }
        display(wNew);
        w = wNew;
        w[0][3][4][4] = 1;
    }
    public static void randomFill(int[][][][] w) {
        Random random = new Random();
        for (int[][][] w2 : w) {
            for (int[][] w3 : w2) {
                for (int[] w4 : w3) {
                    for (int i = 0; i < w4.length; i++) {
                        w4[i] = random.nextInt();
                    }
                }
            }
        }
    }
    public static void display(int[][][][] w) {
        System.out.println("Printing---------------------------------------------------------------------------------");

        System.out.print("[n");
        for (int[][][] w2 : w) {
            System.out.print("t[n");
            for (int[][] w3 : w2) {
                System.out.print("tt[n");
                for (int[] w4 : w3) {
                    System.out.print("ttt[");
                    for (int element : w4) {
                        System.out.print(element + " ");
                    }
                    System.out.print("]n");
                }
                System.out.print("tt]n");
            }
            System.out.print("t]n");
        }
        System.out.print("]n");
    }
}

如您所见,您不必遍历所有子数组。 只是在那些大小发生变化的数组上。

执行它,这将是显而易见的。