Как скопировать 2-мерный массив в Java?

Мне нужно сделать копию довольно большого 2-мерного массива для проекта, над которым я работаю. У меня два 2D-массива:

int[][]current;
int[][]old;

У меня также есть два метода для копирования. Мне нужно скопировать массив, потому что текущий файл регулярно обновляется.

public void old(){
 old=current
}

и

public void keepold(){
 current=old
}

Однако это не работает. Если бы я должен был позвонить старому, сделайте обновление по текущему, а затем вызовите keepold, текущий не будет равен тому, что было изначально. Почему это должно быть?

Спасибо

10 ответов

current=old или old=current заставляет два массива ссылаться на одно и то же, поэтому, если вы впоследствии измените current, будет также изменен old. Чтобы скопировать содержимое массива в другой массив, используйте цикл for

for(int i=0; i
<p>PS: для одномерного массива вы можете избежать создания собственного цикла for, используя <a href="http://download.oracle.com/javase/6/docs/api/java/util/Arrays.html" rel="nofollow noreferrer" target="_blank"><code>Arrays.copyOf


/**
 * Clones the provided array
 * 
 * @param src
 * @return a new clone of the provided array
 */
public static int[][] cloneArray(int[][] src) {
 int length = src.length;
 int[][] target = new int[length][src[0].length];
 for (int i = 0; i < length; i++) {
 System.arraycopy(src[i], 0, target[i], 0, src[i].length);
 }
 return target;
}

Можно ли изменить этот код для поддержки n-мерных массивов объектов?

Вам нужно будет поддерживать произвольные длины массивов и проверить, имеют ли src и destination одинаковые размеры, , и вам также потребуется скопировать каждый элемент каждого массива рекурсивно, если объект также был массивом.

Прошло некоторое время с тех пор, как я опубликовал это, но я нашел хороший пример одного из способов создания n-мерного класса массива, Класс принимает нуль или более целых чисел в конструкторе, задавая соответствующий размер каждого измерения. Класс использует базовый плоский массив Object[] и вычисляет индекс каждого элемента с использованием размеров и массива множителей. (Это то, как массивы выполняются на языке программирования C.)

Копирование экземпляра NDimensionalArray будет таким же простым, как копирование любого другого 2D-массива, хотя вам нужно утверждать, что каждый объект NDimensionalArray имеет равные размеры. Это, вероятно, самый простой способ сделать это, поскольку нет рекурсии, и это делает представление и доступ намного проще.


Я решил, что он написал простую функцию для копирования многомерных массивов int с помощью System.arraycopy

public static void arrayCopy(int[][] aSource, int[][] aDestination) {
 for (int i = 0; i < aSource.length; i++) {
 System.arraycopy(aSource[i], 0, aDestination[i], 0, aSource[i].length);
 }
}

или на самом деле я улучшил его для моего варианта использования:

/**
 * Clones the provided array
 * 
 * @param src
 * @return a new clone of the provided array
 */
public static int[][] cloneArray(int[][] src) {
 int length = src.length;
 int[][] target = new int[length][src[0].length];
 for (int i = 0; i < length; i++) {
 System.arraycopy(src[i], 0, target[i], 0, src[i].length);
 }
 return target;
}


Вы также можете сделать следующее:

public static int[][] copy(int[][] src) {
 int[][] dst = new int[src.length][];
 for (int i = 0; i < src.length; i++) {
 dst[i] = Arrays.copyOf(src[i], src[i].length);
 }
 return dst;
}


Массивы в java - это объекты, а все объекты переданы по ссылке. Чтобы действительно "скопировать" массив, вместо создания другого имени для массива, вам нужно пойти и создать новый массив и скопировать все значения. Обратите внимание, что System.arrayCopy полностью копирует 1-мерные массивы, но НЕ 2-мерные массивы. Причина в том, что 2D-массив на самом деле является 1D массивом из 1D массивов, а arrayCopy копирует указатели на одни и те же внутренние массивы 1D.


current = old ;

Операции присваивания не копируют элементы одного массива в другой. Вы просто делаете матрицу current ссылкой на матрицу old. Вам нужно сделать мудрый экземпляр участника.


public static byte[][] arrayCopy(byte[][] arr){
 if(arr!=null){
 int[][] arrCopy = new int[arr.length][] ;
 System.arraycopy(arr, 0, arrCopy, 0, arr.length);
 return arrCopy;
 }else { return new int[][]{};}
}


Я использую эту функцию:

public static int[][] copy(final int[][] array) {
 if (array != null) {
 final int[][] copy = new int[array.length][];
 for (int i = 0; i < array.length; i++) {
 final int[] row = array[i];
 copy[i] = new int[row.length];
 System.arraycopy(row, 0, copy[i], 0, row.length);
 }
 return copy;
 }
 return null;
}

Большое преимущество этого подхода состоит в том, что он также может копировать массивы, которые не имеют одинакового количества строк, например:

final int[][] array = new int[][] { { 5, 3, 6 }, { 1 } };


Здесь вы можете сделать это, используя циклы.

public static int[][] makeCopy(int[][] array){
 b=new int[array.length][];
 for(int row=0; row


Вы можете дать код ниже,

public void multiArrayCopy(int[][] source,int[][] destination){
destination=source.clone();}

Надеюсь, что это сработает.

licensed under cc by-sa 3.0 with attribution.