Foros del Web » Programación para mayores de 30 ;) » Java »

¿Clone() NO superficial de matrices?

Estas en el tema de ¿Clone() NO superficial de matrices? en el foro de Java en Foros del Web. Buenas. ¿Hay en Java algún modo de hacer un clone() para clonar una matriz (array bidimensional) sabiendo que cada "casilla" de esa matriz contiene un ...
  #1 (permalink)  
Antiguo 09/11/2011, 10:45
 
Fecha de Ingreso: abril-2004
Mensajes: 107
Antigüedad: 20 años
Puntos: 0
¿Clone() NO superficial de matrices?

Buenas.

¿Hay en Java algún modo de hacer un clone() para clonar una matriz (array bidimensional) sabiendo que cada "casilla" de esa matriz contiene un tipo contenedor que contiene a su vez dos elementos?

He probado así, pero me da Aliasing cuando hago luego un cambio en una de las matrices:

Código:
public MiClase clone(){
		
		MiClase copia = null;
		try {
			copia = (MiClase) super.clone();
			copia.matriz = Arrays.copyOf(this.matriz, this.matriz.length).clone();
		} catch (CloneNotSupportedException e) {
			e.printStackTrace();
		}
  #2 (permalink)  
Antiguo 09/11/2011, 13:39
 
Fecha de Ingreso: noviembre-2011
Mensajes: 8
Antigüedad: 12 años, 5 meses
Puntos: 2
Respuesta: ¿Clone() NO superficial de matrices?

Según el API de Java, solo hace una copia del array como tal pero su contenido es similar para ambas instancias. entonces debemos implementar un código para una clonacion mas profunda.

Código Java:
Ver original
  1. A[] original = ....
  2. A[] copy = new A[original.length)
  3. for (int i = 0; i < as.length; i++)  {
  4.             copy[i] = (A) as[i].clone();
  5. }


Para cada item dentro del array implementar clone(). supongo que puede existir una forma mucho mas rápida.
  #3 (permalink)  
Antiguo 09/11/2011, 13:43
 
Fecha de Ingreso: abril-2004
Mensajes: 107
Antigüedad: 20 años
Puntos: 0
Respuesta: ¿Clone() NO superficial de matrices?

Gracias. Eso ya lo he hecho:

Código:
@Override	
	public Matrix clone(){
		
		Matrix copia = null;
		try {
			copia = (Matrix) super.clone();
			copia.matriz = Arrays.copyOf(this.matriz, this.matriz.length);
					
			for(int x = 0 ; x < dimensionX ; x++){
				for (int y = 0 ; y < dimensionY ; y++){
					copia.matriz[x][y] =  this.matriz[x][y].clone();
				}
			}
			
		} catch (CloneNotSupportedException e) {
			e.printStackTrace();
		}
		
		return copia;	
	}

Yo creo que eso está bien, y this.matriz[x][y].clone(); llama al clone() del objeto que hay en cada posición de la matriz.


Pero creo que algo mal hago, porque el "aliasing" me está dando la tarde.
  #4 (permalink)  
Antiguo 09/11/2011, 14:06
 
Fecha de Ingreso: noviembre-2011
Mensajes: 8
Antigüedad: 12 años, 5 meses
Puntos: 2
Respuesta: ¿Clone() NO superficial de matrices?

si efectivamente y el problema radica en esta linea

copia.matriz = Arrays.copyOf(this.matriz, this.matriz.length);

funciona inicial izando el array normalmente.

copia.matriz = new A[dimensionX][dimensionY];
  #5 (permalink)  
Antiguo 09/11/2011, 14:43
 
Fecha de Ingreso: abril-2004
Mensajes: 107
Antigüedad: 20 años
Puntos: 0
Respuesta: ¿Clone() NO superficial de matrices?

Muchas gracias jzElias. ^^. Ahora va perfecto.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:40.