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

如何在不使用arraylist的情况下调整多维数组的大小(java),java,multidimensional-array,resize,Java,Multidimensional Array,Resize,我需要将数组的大小从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

我需要将数组的大小从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;

(...)
系统阵列副本(w,0,wNew,0,20)

这20是要复制的数组元素数。你已经换了新的尺寸,用旧的。在你的例子中是18

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

但更重要的是,你不必重复所有的维度。我会告诉你一些你可以自己执行的代码

导入java.util.array; 导入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("\t\t[\n");
                for (int[] w4 : w3) {
                    System.out.print("\t\t\t[");
                    for (int element : w4) {
                        System.out.print(element + " ");
                    }
                    System.out.print("]\n");
                }
                System.out.print("\t\t]\n");
            }
            System.out.print("\t]\n");
        }
        System.out.print("]\n");

    }

}
公共类测试{
公共静态最终整数大小_DIM1=2;
公共静态最终整数大小_DIM2=2;
公共静态最终整数大小_DIM3=5;
公共静态最终整数大小_DIM4=5;
私有静态最终整数增量=2;
公共静态void main(字符串[]args){
int[]w=新int[SIZE_DIM1][SIZE_DIM2][SIZE_DIM3][SIZE_DIM4];
随机填充(w);
显示器(w);
int[]wNew=新int[SIZE_DIM1+增量][SIZE_DIM2+增量][SIZE_DIM3][SIZE_DIM4];
对于(int i=0;i
如您所见,您不必迭代所有子数组。就在那些改变尺寸的衣服上


执行它,它就会变得很明显。

它如何与您的方法不兼容?我添加了错误消息。这很有效。问题是,我得到了一个java.lang.ArrayIndexOutOfBoundsException:18,在后面的几行中,当在for循环中首次操作w时,应该使用w.length。你在复制东西,所以你只需要“阅读”你的来源。如果您需要初始化目标元素,请在主循环之前进行初始化,也可以向您提供说明。但是如何在大小方面使w=wNew呢?我再次更新了我的答案,有一段时间我没有使用普通的旧数组。碰巧Systrem.arraycopy(…)没有在其复制的索引中保留“额外”空间。这意味着w[0][19]将不起作用,但w[19][19]将与我的初始答案一起起作用。要解决此问题,请参考我的更新答案。您只需要在不断变化的维度上进行迭代
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("\t\t[\n");
                for (int[] w4 : w3) {
                    System.out.print("\t\t\t[");
                    for (int element : w4) {
                        System.out.print(element + " ");
                    }
                    System.out.print("]\n");
                }
                System.out.print("\t\t]\n");
            }
            System.out.print("\t]\n");
        }
        System.out.print("]\n");

    }

}