>我需要将数组的大小从 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");
}
}
如您所见,您不必遍历所有子数组。 只是在那些大小发生变化的数组上。
执行它,这将是显而易见的。