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

problema al tener dos arrays iguales

Estas en el tema de problema al tener dos arrays iguales en el foro de Java en Foros del Web. Hola, tengo un sencillo problema que no se porque me pasa y me gustaria que me dijerais porque. En una clase, en mi constructor recibo ...
  #1 (permalink)  
Antiguo 03/10/2010, 10:43
 
Fecha de Ingreso: junio-2010
Mensajes: 44
Antigüedad: 13 años, 9 meses
Puntos: 0
problema al tener dos arrays iguales

Hola,

tengo un sencillo problema que no se porque me pasa y me gustaria que me dijerais porque.

En una clase, en mi constructor recibo un array.
Previamente me creo 2 arrays, uno ORIGINAL y otro COPIA.
Esto lo hago porque quiero hacer modificaciones en la COPIA y que el otro no se me modifique.

os pongo el codigo:

Código:
 
ArrayList<personas> original = new ArrayList<personas>();
ArrayList<personas> copia = new ArrayList<personas>();

public Liga3(java.awt.Frame parent, boolean modal, ArrayList<personas> recibe, int opcion_elegida) {
        super(parent, modal);
        initComponents();
        this.getContentPane().setBackground(new Color(91,151,242));
        this.original = recibe;
        this.copia = recibe;
        this.opcion_elegida = opcion_elegida;
        cargar();
}
A continuacion, en otro metodo, hago una seria de cosas, y luego borro un elemento del array COPIA, pero se me borra tambien del array ORIGINAL!!
Es mas, el array que recibo de la clase padre, el que recibe "recibe", tambien se me borran de ahi los elementos! Porque me pasa eso? que hago mal?
Código:
public void cargar(){
        Random rand = new Random();

        int x = rand.nextInt(copia.size());
        String uno_Nombre = copia.get(x).getNombre();
        String uno_Ape1 = copia.get(x).getApellido1();
        copia.remove(x);
}
Pues eso, al hacer el remove en copia, si pongo un System.out.println para copia y para original, pues elimina el elemento de los 2 arraylist.

Alguna solucion? Porque me pasa eso?

gracias
  #2 (permalink)  
Antiguo 03/10/2010, 11:59
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 14 años, 11 meses
Puntos: 306
Respuesta: problema al tener dos arrays iguales

Tienes un error muy grande de concepto, una cosa son las referencias a los objetos y otra los propios objetos.

Cita:
ArrayList<personas> original = new ArrayList<personas>();
ArrayList<personas> copia = new ArrayList<personas>();
A dos referencias les asignas objetos lista distintos y vacíos


Cita:
this.original = recibe;
this.copia = recibe;
Aquí no estás rellenando tus dos listas vacías, lo que estás haciendo es que original y copia (referencias) apunten ahora a la lista recibe, al mismo objeto.

Y por eso mismo te sucede lo mismo con el que pasas como parámetro, ya que recibe no es un objeto, es una referencia al objeto lista creado en la clase padre.
  #3 (permalink)  
Antiguo 04/10/2010, 01:31
 
Fecha de Ingreso: junio-2010
Mensajes: 44
Antigüedad: 13 años, 9 meses
Puntos: 0
Respuesta: problema al tener dos arrays iguales

Cita:
Iniciado por Xerelo Ver Mensaje
Tienes un error muy grande de concepto, una cosa son las referencias a los objetos y otra los propios objetos.



A dos referencias les asignas objetos lista distintos y vacíos




Aquí no estás rellenando tus dos listas vacías, lo que estás haciendo es que original y copia (referencias) apunten ahora a la lista recibe, al mismo objeto.

Y por eso mismo te sucede lo mismo con el que pasas como parámetro, ya que recibe no es un objeto, es una referencia al objeto lista creado en la clase padre.

Gracias por la aclaracion xerelo. Estoy empezando en esto y aun hay cosas que no tenia muy claras.

Entonces, como puedo tener un array lleno con los mismos elementos que un array en la clase padre?

Es decir, yo tengo en una clase padre este arrayList:
Código:
ArrayList<Personas>  inicio = new ArrayList<personas>();
Y luego voy llenandola en un metodo con:
Código:
Personas pe = new Personas(id, nombre, ape1, ape2);
inicio.add(pe);
Y quiero que tener ese arrayList con esos datos en una ventana hija.
Yo lo estaba pasando como antes he dicho, lo pasaba en el constructor y luego hacia el "this.x = y;"

Código:
VentanaHija ss = new VentanaHija(null, true, inicio, opcion_elegida);
Y en el constructor ya me declaraba el ArrayList recibe y hacia el this.

Como lo puedo hacer?
  #4 (permalink)  
Antiguo 04/10/2010, 01:54
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 14 años, 11 meses
Puntos: 306
Respuesta: problema al tener dos arrays iguales

http://download.oracle.com/javase/1....ArrayList.html

Echándole un vistazo a la API verías el método clone(), addAll(), o new ArrayList(Collection c).

De todas formas, la clonación de objetos puede complicarse, así que puedes probar con toArray() o mediante collections/iterators.
  #5 (permalink)  
Antiguo 04/10/2010, 04:00
 
Fecha de Ingreso: junio-2010
Mensajes: 44
Antigüedad: 13 años, 9 meses
Puntos: 0
Respuesta: problema al tener dos arrays iguales

Cita:
Iniciado por Xerelo Ver Mensaje
[url]http://download.oracle.com/javase/1.4.2/docs/api/java/util/ArrayList.html[/url]

Echándole un vistazo a la API verías el método clone(), addAll(), o new ArrayList(Collection c).

De todas formas, la clonación de objetos puede complicarse, así que puedes probar con toArray() o mediante collections/iterators.
he leido mas o menos la api. Digo mas o menos porque mi ingles no es muy bueno que digamos...

Y bueno, no me soluciona del todo el problema porque lo que yo quiero es pasar el array a otra clase...

Es decir. Si estoy en la misma clase, si que puedo hacer de un array a otro el toArray(), pero si lo quiero pasar a un arrayList que esta en otra clase hija?

Que hago, lo paso en el constructor como he hecho y luego hago el toArray?

De nuevo gracias
  #6 (permalink)  
Antiguo 04/10/2010, 04:57
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 14 años, 11 meses
Puntos: 306
Respuesta: problema al tener dos arrays iguales

Cuando pasas un ArrayList(objeto) a un método, sea o no de la misma clase, lo que realmente le pasas es una referencia al objeto.

Por lo tanto, si quieres tratar ese objeto sin que afecte al original necesitas crear otro objeto. Puedes pasarle como parámetro la lista clonada, o pasarle el original y crear la nueva lista en el método.

Si utilizas clone(), tendrás una copia del arrayList, si usas toArray(), creas un nuevo objeto de tipo array, no de arrayList. En cualquier caso, ninguno será el objeto original, por lo que puedes modificarlo. Eso sí, si creas el clon en el método, una vez que salgas del método perderás los cambios en la copia, a menos que lo devuelvas con un return y se lo asignes a la referencia original o a otra referencia que hayas creado.

Tienes que diferenciar entre modificar el contenido del array, y modificar los objetos contenidos en un array. Si eliminas o añades un objeto en la lista copia, en el original seguirán existiendo los mismos objetos que al principio, pero si modificas un objeto Persona, entonces se te modifica en la copia y en el original.

Recuerda, ArrayList es un array dinámico, toArray() genera un array estático, no son el mismo tipo de objeto.
  #7 (permalink)  
Antiguo 05/10/2010, 05:50
 
Fecha de Ingreso: junio-2010
Mensajes: 44
Antigüedad: 13 años, 9 meses
Puntos: 0
Respuesta: problema al tener dos arrays iguales

Cita:
Iniciado por Xerelo Ver Mensaje
Cuando pasas un ArrayList(objeto) a un método, sea o no de la misma clase, lo que realmente le pasas es una referencia al objeto.

Por lo tanto, si quieres tratar ese objeto sin que afecte al original necesitas crear otro objeto. Puedes pasarle como parámetro la lista clonada, o pasarle el original y crear la nueva lista en el método.

Si utilizas clone(), tendrás una copia del arrayList, si usas toArray(), creas un nuevo objeto de tipo array, no de arrayList. En cualquier caso, ninguno será el objeto original, por lo que puedes modificarlo. Eso sí, si creas el clon en el método, una vez que salgas del método perderás los cambios en la copia, a menos que lo devuelvas con un return y se lo asignes a la referencia original o a otra referencia que hayas creado.

Tienes que diferenciar entre modificar el contenido del array, y modificar los objetos contenidos en un array. Si eliminas o añades un objeto en la lista copia, en el original seguirán existiendo los mismos objetos que al principio, pero si modificas un objeto Persona, entonces se te modifica en la copia y en el original.

Recuerda, ArrayList es un array dinámico, toArray() genera un array estático, no son el mismo tipo de objeto.
Perdon que sea tan pesado pero como dice el refran: "prefiero ser tonto 5 minutos que toda la vida"

Lo del toArray lo descarto porque quiero que siga siendo ArrayList.
Me da igual como quede el arrayList copia cuando salga del metodo.

Yo solo quiero un arrayList exactamente igual que el original, para hacer los trapicheos que quiera sin que se vea moficiado el origianl, ya que el original lo usarare en la clase padre para otras cosas. Por eso quiero hacer una copia en la ventana hija y ahi hacer lo que sea con esa copia.

entonces una solucion seria, hacer el .clone() del original en la ventana padre, y esa clonacion que se llamara copia pasarla en el constructor a la clase hija no? Luego lo de la clase hija lo haria igual que lo tengo ahora, pero me da igual que sea referencia y se modifique la clonada, porque con tal de que no me modifique la original.... no?

Es una solucion no? O pasarle directamente la original en el constructor y una vez la tengo en la clase hija, hacer ahi la clonacion,....

  #8 (permalink)  
Antiguo 05/10/2010, 06:16
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 14 años, 11 meses
Puntos: 306
Respuesta: problema al tener dos arrays iguales

Cita:
entonces una solucion seria, hacer el .clone() del original en la ventana padre, y esa clonacion que se llamara copia pasarla en el constructor a la clase hija no? Luego lo de la clase hija lo haria igual que lo tengo ahora, pero me da igual que sea referencia y se modifique la clonada, porque con tal de que no me modifique la original.... no?

Es una solucion no? O pasarle directamente la original en el constructor y una vez la tengo en la clase hija, hacer ahi la clonacion,....
es lo mismo que

Cita:
Por lo tanto, si quieres tratar ese objeto sin que afecte al original necesitas crear otro objeto. Puedes pasarle como parámetro la lista clonada, o pasarle el original y crear la nueva lista en el método.
  #9 (permalink)  
Antiguo 05/10/2010, 10:01
 
Fecha de Ingreso: junio-2010
Mensajes: 44
Antigüedad: 13 años, 9 meses
Puntos: 0
Respuesta: problema al tener dos arrays iguales

Cita:
Iniciado por Xerelo Ver Mensaje
es lo mismo que

perdon...aunque no te lo creas, me habia saltado esa linea y me habia ido al parrafo gordo

gracias!

Etiquetas: arrays, dos, iguales
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 18:11.