ArrayList 2-х мерного массива int - PullRequest
0 голосов
/ 03 июня 2018

Я пытаюсь создать ArrayList из 2-х мерных массивов.Это тот же массив 2 dim, который я добавляю в ArrayList, но каждый раз он имеет разные значения.Проблема в том, что когда я добавляю массив в список, он автоматически обновляет другие версии массива в списке.Я пытался клонировать / скопировать массив непосредственно перед добавлением его в список, но он не имеет никакого эффекта.

import java.util.*;

public class Test {
   static ArrayList<int[][]> list = new ArrayList<int[][]>();

   public static void main(String[] args) {
      Lister L = new Lister();
   }

   public static void add(int[][] array) {
      list.add(array);
      printArray();
   }

   public static void printArray() {
      for (int i = 0; i < list.size(); i++) {
         System.out.println("Element: " + i);
         printDim(list.get(i));
      }
      System.out.println("--------------------------------");
   }

   public static void printDim(int[][] array) {
      for (int x = 0; x < array.length; x++) {
         for (int y = 0; y < array[0].length; y++) {
            System.out.print(array[y][x]+" ");
         }
         System.out.println();
      }
      System.out.println("-----------");
   }
}

class Lister {
   Lister() {
      int[][] array1 = new int[5][5];
      array1[0][4] = 1;
      Test.add(array1);
      int[][] array2 = array1.clone();
      array2[1][2] = 1;
      Test.add(array2);
   }
}

Вывод:

Element: 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
1 0 0 0 0
---------------------
Element: 0
0 0 0 0 0
0 0 0 0 0
0 1 0 0 0
0 0 0 0 0
1 0 0 0 0
-----------
Element: 1
0 0 0 0 0
0 0 0 0 0
0 1 0 0 0
0 0 0 0 0
1 0 0 0 0
--------------------

Ожидаемый вывод:

Element: 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
1 0 0 0 0
--------------------
Element: 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
1 0 0 0 0
-----------
Element: 1
0 0 0 0 0
0 0 0 0 0
0 1 0 0 0
0 0 0 0 0
1 0 0 0 0
---------------------

Ответы [ 2 ]

0 голосов
/ 03 июня 2018

2D-массив не может быть скопирован поверхностно.Поскольку это массив массивов, поверхностная копия даст вам новый внешний массив, содержащий ссылки на те же внутренние массивы, что и оригинал.

Вместо этого вам нужно реализовать глубокую копию:

int[][] array2 = array1.clone();
for (int i = 0; i < array2.length; i++) {
    array2[i] = array1[i].clone();
}

Обратите внимание, что это работает только для примитивных массивов.Если у вас есть массивы объектов, вам также необходимо скопировать каждый объект (за исключением того, что вы можете использовать те же объекты, на которые ссылаются).

0 голосов
/ 03 июня 2018

Это потому, что вы все еще используете ту же «матрицу» типа int.Это следует исправить, объявив его снова после использования первого.

import java.util.*;

class Test {
   static ArrayList<int[][]> list = new ArrayList<int[][]>();

   public static void main(String[] args) {
      int[][] array1 = new int[5][5];
      array1[0][4] = 1;
      list.add(array1);

      array1 = new int[5][5];
      array1[1][2] = 1;

      list.add(array1);
      printArray();
   }

   public static void printArray() {
      for (int i = 0; i < list.size(); i++) {
         printDim(list.get(i));
      }
   }

   public static void printDim(int[][] array) {
      for (int x = 0; x < array.length; x++) {
         for (int y = 0; y < array[0].length; y++) {
            System.out.print(array[y][x]+" ");
         }
         System.out.println();
      }
      System.out.println("--------");
   }
}
...