2017-01-10 4 views
0

Мне нужно сбросить размер массива от w [i] [j] [q] [k] до w [i + 2] [j + 2 ] [Q] [к]. Я не хочу использовать массив списков, так как мне придется менять большие части моей программы. В некоторых потоках я читал, что можно создать новый массив нужного размера и скопировать содержимое из исходного массива в новый массив с помощью java.lang.System.arraycopy (...).Как изменить размер многомерного массива без использования arraylist (java)

Я попытался это следующим образом, но это не работает с моим подходом:

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) 
+2

** Как ** это не работает с вашим подходом *? –

+0

Я добавил сообщение об ошибке. – Hendrik

ответ

1

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

это 20 является число массива элементов для копирования Вы поместили новый размер, используйте старый. В вашем примере это 18.

Во-вторых, ваши петли на основе вашего нового размера. Это назад, вы должны прочитать свой исходный массив и вставить в новый массив, поэтому вам придется перебирать исходный размер массива (для изменения размера, конечно, чтобы уменьшить его, было бы наоборот).

Но, что еще более важно, вам не нужно перебирать все варианты. Я пропущу вам код, который вы можете выполнить, чтобы убедиться в этом сами.

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("\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"); 

    } 

} 

Как вы можете видеть, вам не нужно перебирать все вспомогательные массивы. только на тех, у которых их размеры меняются.

Выполните его, и это будет очевидно.

+0

Это работает. Проблема в том, что я получаю java.lang.ArrayIndexOutOfBoundsException: 18 в последующих строках при первом обращении к w снова – Hendrik

+0

В ваших циклах for вы должны использовать w.length. Вы копируете материал, поэтому вам нужно только «читать» из вашего источника. Если вам нужно инициализировать элемент назначения, сделайте это до основного цикла также –

+0

На самом деле я собираюсь отредактировать свой ответ –