Cópia de array

Tenho uma array “a” e uma array “b”;

		double [][] a = {{1,2,3},{4,5,6},{7,8,9}};
		double [][] b = new double[3][3];

Quero fazer uma cópia da array “a” para a array “b”.

O código abaixo faz com que “b” passe a apontar para o endereço de “a”, com isso, toda modificação que eu fizer em “b” é refletida também em “a”. Pois na verdade são dois ponteiros apontando para a mesma região na memória.

		b = a;

Já os códigos abaixo fazem com que “a” e “b” apontem para posições de memória diferentes, porém o conteúdo dessas posições de memória apontam para o mesmo local. Pois por ser um array bi-dimensional, ele é um ponteiro que aponta para um array de ponteiros.

Com isso, as alterações em “b” continuam alterando “a”.

b = a.clone();

OU

System.arraycopy(a, 0, b, 0, a.length);

Existe maneira elegante de fazer isso ou tenho que fazer da forma abaixo?


		for (int i=0; i < a.length; i++) {
			for (int j=0; j < 3; j++) {
				b[i][j] = a[i][j];
			}
		}

OU


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

OU Ainda…

		for (int i=0; i < a.length; i++) {
			System.arraycopy(a[i],0,b[i],0,a.length);
		}
		

Obs: Não quero usar Lista nem nenhum outro tipo de objeto/estrutura de dados/abstração. Quero usar array.

assim dá pra copiar os arrays

for (int i=0; i < num_linhas; i++) {
for (int j=0; j < num_colunas; j++) {
arrayB[i][j]=array[i][j];
}
}

Acho que você não leu a minha mensagem.

Essa solução eu mesmo apresentei.

Pergunto se não há maneira mais elegante/eficiente de se fazer isso.

Tenta ver se os métodos de cópia encontrados na classe Arrays podem ajudar…

[]'s.

Pode tentar este: http://javatechniques.com/blog/faster-deep-copies-of-java-objects/

Você pode tentar algo como o que mostro abaixo, mas tome um pouco de cuidado. Entenda direitinho o que está sendo feito abaixo.

class TesteClone {
    public static void main(String[] args) {
        double[][] mat1 = {
           {1, 2, 3},
           {4, 5},
           {6, 7, 8, 9, 10}
        };

        double[][] mat2 = mat1.clone(); // note que isto só clona a primeira dimensão!

        double[][] mat3 = mat1.clone(); // clonamos a primeira dimensão...
        for (int i = 0; i < mat3.length; ++i) {
            mat3[i] = mat1[i].clone(); // e clonamos a segunda também:
        }

        mat1 [2][3] = -mat1 [2][3];
        System.out.println (mat1[2][3]); // imprime -9
        System.out.println (mat2[2][3]); // Se a segunda dimensão tivesse sido clonada, 
                                         // imprimiria +9, mas imprime -9
        System.out.println (mat3[2][3]); // imprime +9
         
    }
}

A solução de clonagem da segunda dimensão eu também apresentei lá em cima:


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

Eu queria saber se existe uma solução mais limpa, sem uso de for.