Como copio uma matriz bidimensional em Java?

Preciso fazer uma cópia de uma matriz bidimensional razoavelmente grande para um projeto em que estou trabalhando. Eu tenho dois arrays 2D:

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

Eu também tenho dois methods para fazer a cópia. Eu preciso copiar a matriz porque a corrente está sendo atualizada regularmente.

 public void old(){ old=current } 

e

 public void keepold(){ current=old } 

Entretanto, isso não funciona. Se eu fosse ligar antigo, fazer uma atualização no atual e, em seguida, chamar keepold, atual não é igual ao que era originalmente. Por que isso seria?

obrigado

current=old ou old=current faz com que os dois vetores se refiram à mesma coisa, portanto, se você modificar o current , o old será modificado também. Para copiar o conteúdo de uma matriz para outra matriz, use o loop for

 for(int i=0; i 

PS: Para uma matriz unidimensional, você pode evitar criar seu próprio loop usando 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; } 

É possível modificar este código para suportar matrizes n-dimensionais de objects ?

Você precisaria dar suporte a comprimentos arbitrários de matrizes e verificar se o src e o destino têm as mesmas dimensões, e também seria necessário copiar cada elemento de cada matriz recursivamente , no caso de o Objeto ser também uma matriz.

Já faz um tempo desde que eu postei isso, mas eu encontrei um bom exemplo de uma maneira de criar uma class de matriz n-dimensional. A class usa zero ou mais inteiros no construtor, especificando o respectivo tamanho de cada dimensão. A class usa uma matriz plana subjacente Object[] e calcula o índice de cada elemento usando as dimensões e uma matriz de multiplicadores. (É assim que as matrizes são feitas na linguagem de programação C.)

Copiar uma instância de NDimensionalArray seria tão fácil quanto copiar qualquer outro array 2D, embora você precise afirmar que cada object NDimensionalArray tem dimensões iguais. Esta é provavelmente a maneira mais fácil de fazê-lo, já que não há recursion, e isso torna a representação e o access muito mais simples.

Eu resolvi escrever uma function simples para copiar matrizes int multidimensionais usando 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); } } 

ou, na verdade, eu o aprimorei para o meu caso de uso:

 /** * 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; } 

Você também pode fazer o seguinte:

 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; } 
 current = old ; 

As operações de atribuição não copiam elementos de um array para outro. Você está apenas fazendo a matriz current referir à matriz old . Você precisa fazer uma cópia sábia do membro.

Arrays em java são objects e todos os objects são passados ​​por referência . Para realmente “copiar” uma matriz, em vez de criar outro nome para uma matriz, você precisa criar uma nova matriz e copiar todos os valores. Observe que System.arrayCopy copiará matrizes unidimensionais totalmente, mas NÃO matrizes bidimensionais. A razão é que um array 2D é, na verdade, um array 1D de arrays 1D, e arrayCopy copia sobre pointers para os mesmos arrays 1D internos.

 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[][]{};} } 

Eu estou usando esta function:

 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; } 

A grande vantagem dessa abordagem é que ela também pode copiar matrizes que não têm a mesma contagem de linhas, como:

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

Veja como você pode fazer isso usando loops.

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

Você pode experimentar o código abaixo,

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

Espero que funcione.