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