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

标签 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 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 循环基于您的新大小。这是向后的,您必须读取原始数组并插入到新数组中,因此您必须迭代原始数组大小(为了调整大小,当然要使其更小,则相反)。

但更重要的是,您不必迭代所有维度。我将向您发送一些代码,您可以执行来亲自查看。

导入java.util.Arrays; 导入 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");

    }

}

正如您所看到的,您不必迭代所有子数组。只是那些尺寸发生变化的。

执行一下,效果就很明显了。

关于java - 如何在不使用数组列表的情况下调整多维数组的大小(java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41560061/

相关文章:

java - AmazonS3Client 已弃用如何使用凭证获取 s3client 对象

html - 如何在保持宽高比和相对于其他 div 的位置的同时垂直缩小 div?

html - 在 CSS 中,如何使表格展开以填充容器 div?

css - HTML5/CSS|出现滚动条时如何禁用响应?

java - 将用户输入编辑文本与 SQLite 数据库 Android Java 进行比较

java - 在混合租赁上下文中生成 EntityManager

java - Sun Solaris 服务器证书中的证书链验证程序错误被 ChainVerifier 拒绝

c++ - arr [0] [2]的传递地址,必须在双指针中接收

c++ - vector 正确吗?

c++ - 构造一个大型多维 vector 数组