Java - Copia de un objeto

 
Vista:

Copia de un objeto

Publicado por calkera (6 intervenciones) el 21/06/2006 12:12:29
Tengo un objeto Camino(que es un Vector de Ojetos), el cual se va modificando dentro de un bucle, pero quiero ir guardando los diferentes caminos que voy modificando en otro Vector (Vector Caminos, cada elemento del vector será un camino), el problema es que cada vez que se modifica el Camino,se modifican todos los caminos que tengo guardado en el Vector Caminos.
Probé a hacer una copia del vector Camino con el metodo clone() y agregar esta copia a Caminos, pero pasa los mismo.

Alguien me puede ayudar.
Gracias.
Saludos, Jorge.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 755
Bronce
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

RE:Copia de un objeto

Publicado por Yamil Bracho (2315 intervenciones) el 21/06/2006 20:25:15
A ver dejame ver si entendi. El codigo que tienes es

Camino camino = new Camino();
Vector caminos = new Vector();

caminos.add( camino )

...

Es asi ? Puedes publicar el codigo que estas usando.. ?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Copia de un objeto

Publicado por Jorge (6 intervenciones) el 22/06/2006 00:35:48
Caminos caminos=new Caminos();
Camino camino=new Camino();
...
while(sigue)
{
Camino temp = new Camino();
temp=recorrerCam(camino,f,c,fila,col); //Devuelve un camino.
....

caminos.insertarCamS(temp);
/* public void insertarCam(Camino cam)
{
caminos.addElement(cam);
} */
camino.mostrarCam();
//muestra el camino correctamente
...
}
caminos.mostrarCamS();
//Aquí se ve el problema,los caminos que voy guardando en el vector caminos
se van modificando segun se modifica el objeto camino,en la primera iteración
del while guarda el camino correcto en la 1º posicion del vector,pero en la
segunda iteración quiero que me guarde el camino que fue modificado en la
función recorrerCam, en cambio, aparte de guardarlos en la posicion 2º tambien
me modifica el camino que tenía gurdado en la posicion1º, y así en cada iteracion
al final me queda un vector con todos caminos iguales al camino que guardo
en la ultima iteración.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 755
Bronce
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

RE:Copia de un objeto

Publicado por Yamil Bracho (2315 intervenciones) el 22/06/2006 20:38:44
Es logico que pase eso... Te explico
Siempre tienes la variable caminio creada uan sola vez. Si en el metodo recorrerCam estas retornando un camino y estas retornando lo que le estas pasando como variable camino pues simpre estas trabajando con la misma referencia en memoria.
No publicas el codigo de recorrerCam pero deduzco que alli esta el problema...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Copia de un objeto

Publicado por Jorge (6 intervenciones) el 22/06/2006 22:48:58
Vale,eso lo ententiendo,pero como lo puedo solucionar? como hago una copia de un objeto sin usar la misma referncia en memoria en un bucle?, ya que no le puedo ir cambiando el nombre.
Quiero recorrer el camino e ir guardando los caminos en un vector.

public Camino recorrerCam(Camino cam,int f,int c,int[] fila,int[] col)
{
int numNod=this.matrizAdy.length;
int pos;
while (c<numNod)
{
while(!(this.existeAct(f,c)))
{
if ((c==(numNod-1))&(f!=0))
{
if (cam.tamaño()>=1)
{
pos=(cam.tamaño());
cam.eliminarCam();
col[pos]=(-1);
fila[pos]=(-1);
pos--;
c=col[pos];
f=fila[pos];
c++;

}
else
{
System.out.print("El tamaño del camino es menor de 1");
return(cam);
}

}
else if ((c==(numNod-1))&(f==0))
{
sigue=false;
return(cam);
}
else
c++;

}
//Fin de mientras no exista elemento
if (c==(numNod))
{
sigue=true;
return(cam);
}
else
{

if ((c==(numNod-1))&(f==0))
{
Actividad temp;
temp = this.extraerElem(f,c);
cam.insertarCam(temp);
sigue=false;
return(cam);
}
else
{
Actividad temp;
temp = this.extraerElem(f,c);
cam.insertarCam(temp);
pos=(cam.tamaño()-1);
fila[pos]=f;
col[pos]=c;
f=c;
c++;

}
}

}
return(cam);
}



public Caminos crearCaminos()
{
int numNod;
numNod=this.tamMatriz();
int f,c,i;
int[]fila = new int[numNod];
int[]col = new int[numNod];
for(i=0;i<numNod;i++)
{
fila[i]=(-1);
col[i]=(-1);
}
Caminos caminos=new Caminos();
Camino camino=new Camino();
Camino prueba = new Camino();
f=0;
c=0;
int cont=(-1);
int pos=0;
sigue=true;
int w=0;
while(sigue)
{
Camino temp = new Camino();
temp=recorrerCam(camino,f,c,fila,col);
if (w==1)
{
prueba=(Camino)temp.clone();
System.out.println("Solo se asigna aqui ");
}
System.out.println("Temp ");
temp.mostrarCam();
System.out.println("***");
System.out.println("Prueba "+w);
prueba.mostrarCam();
System.out.println("*** ");
w++;
if (sigue)
{
caminos.insertarCamS(temp);
camino.mostrarCam();
System.out.println(" ");
pos=(camino.tamaño());
camino.eliminarCam();
pos=(camino.tamaño());
col[pos]=(-1);
fila[pos] =(-1);
pos=(camino.tamaño()-1);
c=(col[pos]);
c++;
f=fila[pos];
}
else
if (!(temp.vacioCam()))
{
caminos.insertarCamS(temp);
camino.mostrarCam();
System.out.println(" ");
}
}
return(caminos);
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 755
Bronce
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

RE:Copia de un objeto

Publicado por Yamil Bracho (2315 intervenciones) el 22/06/2006 23:10:43
Tienes que crear uno nuevo y luego usar el metodo clone para copiar solo la data. Me explico cuando tienes

Objeto a = new Objecto();
Objeto b = a <-- Haces que a y b apuntes al mismo sitio en memoria.

Si haces por ejemplo

a.codigo = 100;
b.codigo = 400;

y imprimis a.codigo tiene el valor de 400, lo que debes hacer es

Objeto a = new Objecto();
Objeto b = new Object()

b = a.clone();

Creo que tu clase debe implementar la interface Cloneable
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Copia de un objeto

Publicado por Jorge (6 intervenciones) el 22/06/2006 23:59:11
Ya probe con el metodo clone ... pero o lo implementé o no funciona.

{
Camino temp = new Camino();
Camino prueba = new Camino();
temp=recorrerCam(camino,f,c,fila,col);
if (w==1)
{
prueba=(Camino)temp.clone();
System.out.println("Solo se asigna aqui ");
}
System.out.println("Temp ");
temp.mostrarCam();
System.out.println("***");
System.out.println("Prueba "+w);
prueba.mostrarCam();
System.out.println("*** ");
w++;

en este fragmento del codigo el camino prueba, debería ser siempre el mismo
ya que solo se asigna una vez el el bucle , pero cambia cada vez que cambia el
camino temp y es una copia suya.

public class Camino implements Cloneable
{
private Vector camino = null;

public Camino()
{
camino = new Vector();
}

public Object clone()
{
Camino clone = null;
try
{
clone = (Camino)super.clone();
}
catch(CloneNotSupportedException e)
{
System.out.println(" no se puede duplicar");
}
return clone;
}

Aqui le añado el metodo CLONE.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar