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

Problema con ArrayList dentro de otro

Estas en el tema de Problema con ArrayList dentro de otro en el foro de Java en Foros del Web. Hola a todos :) Estoy trabajando el tema de los ArrayList, y concretamente hace unos días pregunte como hacer un arrayList dentro de otro. Un ...
  #1 (permalink)  
Antiguo 20/04/2015, 14:47
Avatar de maiksix  
Fecha de Ingreso: noviembre-2014
Ubicación: Sabadell
Mensajes: 124
Antigüedad: 9 años, 5 meses
Puntos: 1
Problema con ArrayList dentro de otro

Hola a todos :)

Estoy trabajando el tema de los ArrayList, y concretamente hace unos días pregunte como hacer un arrayList dentro de otro. Un compañero respondió y lo soluciono. Ahora mismo tengo la estructura montada, y estoy trabajando en el uso de esas estructuras.

Concretamente tengo las siguientes líneas de código:

Código:
	
              int actual=0;
              int decision=0;
              int aux=0;
              int contador_rutas=0;
              String nameOrigin=null;
              String nameLlegada=null;
              xOrigen=0;
              yOrigen=0;
              xDestino=0;
              yDestino=0;
              
              
              Ruta.add(new Leg(nameOrigin, xOrigen, yOrigen)); //Origen
     			Ruta.add(new Leg(nameLlegada, xDestino, yDestino));//Intermedio
     			Ruta.add(new Leg(nameOrigin, xOrigen, yOrigen));
           
              while((actual<Aeropuertos.size())){  
             	 while((aux<Aeropuertos.size())){
             	Dummy.add(new Route()); //Ruta
           		
             	while(decision==0){
           		//Salida
           			if((aux<Aeropuertos.size())){
           		nameOrigin=Aeropuertos.get(actual).getname();
           		xOrigen=Aeropuertos.get(actual).getX();
           		yOrigen=Aeropuertos.get(actual).getY();
           		hsalida=matriz_departure[actual][aux];
           		// matriz[a][b]=(int)calcularDistancia(xOrigen, yOrigen, xDestino, yDestino);
           		//Llegada
           		nameLlegada=Aeropuertos.get(aux).getname();
           		xDestino=Aeropuertos.get(aux).getX();
           		yDestino=Aeropuertos.get(aux).getY();
           		hllegada=matriz_arrival[actual][aux];
           		//Add node
           		if(nameOrigin!=nameLlegada){
           			//aixo sets
           			Ruta.get(0).setDeparture(nameOrigin);
           			Ruta.get(0).setxOrigen(xOrigen);
           			Ruta.get(0).setyOrigen(yOrigen);
           			
           			Ruta.get(1).setDeparture(nameLlegada);
           			Ruta.get(1).setxOrigen(xDestino);
           			Ruta.get(1).setyOrigen(yDestino);
           			
           			Ruta.get(2).setDeparture(nameOrigin);
           			Ruta.get(2).setxOrigen(xOrigen);
           			Ruta.get(2).setyOrigen(yOrigen);
           			
System.out.println("Rutas "+contador_rutas +"O" +Ruta.get(0).getDeparture() + " P "+Ruta.get(1).getDeparture() +" E "+Ruta.get(2).getDeparture());
           			Dummy.get(contador_rutas).setArray(Ruta);
           			contador_rutas++;
           		 decision=1;
           		}
           		//Increment variable 
           		aux++;
           			}else{
           				decision=1;
           				}
           		}
           		decision=0;
           		//aux=0;
              }
           	 aux=0;
              actual++;
            }

//-------------------------------------------------------------------SHOWS DUMMY SOLUTION-----------------------------------------------------------------
              
              int counter=0;
              int interno=0;
              ArrayList<Leg> solucion=new ArrayList();
             while(counter<Dummy.size()){
            	  System.out.println();
            	  System.out.println("-----------------------------Ruta "+(counter +1)+" ----------------------------");
            	  System.out.println();
            	  solucion=Dummy.get(counter).getArray();
            	  interno=0;
            	  while(interno<solucion.size()){
            		 System.out.println("P "+(interno+1)+" --> "+solucion.get(interno).getDeparture());
            		  interno++;
            	  }
            	  counter++;
              }
En estas líneas pretendo hacer todas las combinaciones posibles del ArrayList aeropuertos, y luego mostrarlas en pantallas.

En este arrayList tengo en posición 0: Barcelona, posición 1: Lisboa, Posición 2: Milan.
Y por lo tanto con las lineas anteriores quiero que en cada nodo del arraylist Dummy, haya en su interior otras tres cajitas (Ruta).
Por ejemplo: Posición 1 de Dummy tiene que tener dentro otro array (Ruta) con p1: Barcelona, p2: Lisboa, p3:Barcelona. Posición 2 de Dummy otro array Ruta con p1: Barcelona, p2: Milan, p3: Barcelona, Posición 3 de Dummy otro array con p1: Lisboa, p2: Barcelona, p3: Lisboa... etc... hasta hacer todas las combinaciones

En el trozo marcado en rojo me saca los valores que cojo del arraylist Aeropuertos y muestra correctamente que cojo los valores correctos del ArrayList aeropuertos para hacer la solución esperada. Pero cuando le dijo que saque por pantalla el arraylist dummy, con el contenido del arraylist Ruta (un arraylist ruta para cada nodo del arraylist dummy) me lo muestra mal...

Concretamente siempre me muestra P1 de Ruta dentro de cada nodo de Dummy: Milan, P2: Lisboa, P3: Milan... Por lo que intuyo o que siempre me guarda el mismo arraylist Ruta en todas las posiciones del Arraylist Dummy o la impresión de los valores esta mal y el calculo es correcto... Aunque he estado mirando rato e incluso haciendo a mano el algoritmo para ver si veía donde fallaba y no he visto nada raro...

Alguna idea? De si estoy montando mal la estructura, las referencias, de si falta algún índice o cualquier otra cosa?

Muchísimas gracias, como siempre. Y un saludo!!
__________________
Going hard for too long... Can't get enough

Última edición por maiksix; 20/04/2015 a las 14:52
  #2 (permalink)  
Antiguo 21/04/2015, 09:40
Avatar de maiksix  
Fecha de Ingreso: noviembre-2014
Ubicación: Sabadell
Mensajes: 124
Antigüedad: 9 años, 5 meses
Puntos: 1
Respuesta: Problema con ArrayList dentro de otro

Hola!

He estado probando a lo largo del día de hoy y se exactamente donde esta el problema. Resulta que la estructura esta bien, el fallo está en los valores que guarda.
Si en el paso 1 debe guardar Barcelona - Lisboa - Barcelona en la posición 0 del array Dummy, y en el paso 2 en la posición 1 debe guardar: Barcelona Milan Barcelona, siempre guarda Barcelona milan Barcelona, incluso en la posición 0....

No entiendo porque, hasta donde se el paso es por valor y no por referencia... por lo que debería hacerlo bien. Además le indico con un indice en el Dummy.get(indice) la posición en la que debe guardarlo, por lo que no debería guardarlo en todas las posiciones del arraylist dummy...

Voy bastante perdido aunque ya se porque falla.

Si alguien sabe porque puede ser.
__________________
Going hard for too long... Can't get enough
  #3 (permalink)  
Antiguo 21/04/2015, 10:18
 
Fecha de Ingreso: marzo-2015
Mensajes: 45
Antigüedad: 9 años, 1 mes
Puntos: 2
Respuesta: Problema con ArrayList dentro de otro

Hola...

Cada nuevo registro sera un nuevo objeto que creas para agregarlo a la lista, ya que sino haces eso ocurre que no importa cuantas veces iteres la lista siempre guardara el mismo resultado al tener en cuenta que para Java ese Objeto que le estas pasando sigue siendo el mismo.

Por lo tanto, para agregar nuevos valores a tu lista deberías intentar algo como lo siguiente...

Código Java:
Ver original
  1. Objeto o = new Objeto()
  2. a.setCampo(0);
  3. a.setCampo("Nombre");
  4. lista.add(a);
  5.  
  6. o = new Objeto()
  7. a.setCampo(1);
  8. a.setCampo("Apellido");
  9. lista.add(a);

Observa como voy creando un nuevo objeto por cada nuevo valor que agrego a la lista, sino hacemos eso el valor siempre sera 0 y "nombre".

Sin mas que comentar, cualquier duda y/o inconveniente, aquí estamos. Suerte!
  #4 (permalink)  
Antiguo 22/04/2015, 10:08
Avatar de maiksix  
Fecha de Ingreso: noviembre-2014
Ubicación: Sabadell
Mensajes: 124
Antigüedad: 9 años, 5 meses
Puntos: 1
Respuesta: Problema con ArrayList dentro de otro

Gracias por tu respuesta :)

Entiendo lo que dices pero no es lo que hago en: nodo_dummy.add(new Route());?

El problema lo tengo en que dentro de cada new Route, hay un arrayList llamado nodos.
Pero siempre guarda el mismo valor en todos...

Es decir, el arrayList nodo_dummy tiene 2 posiciones.
En la 0 tiene que guardar BCN-LIS-BCN y en la 1 tiene que guardar MIL - Lis - Milan. He comprobado si en la 0 guarda el valor correcto antes de que guarde el Mil-Lis-Milan, y lo hace bien, pero cuando le digo que en la posición 1 guarde Mil-Lis-Milan me lo guarda también en la posición 0...

Y la verdad no lo entiendo, por lo que se el paso es por valor, por lo que no debería cambiarlo en todos los sitios...

Yo lo que hago es un set en el arrayList que quiero guardar dentro de cada posición del otro arraylist:
Código:
nodos.get(0).setDeparture(nameOrigin);
nodos.get(1).setDeparture(nameLlegada);
nodos.get(2).setDeparture(nameOrigin);
Y luego le dijo que a cierta posición del ArrayList nodo_dummy le asigne el ArrayList seteado:
Código:
nodo_dummy.get(actual).setArray(nodos);
He comprobado y actual va incrementando empezando por 0 así que debería funcionar si no me equivoco...

Lógicamente antes de estas líneas hago un
Código:
 
nodo_dummy.add(new Route());
No se si ahora me explicado mejor? Es que he probado la solución que me has dado, pero precisamente hace el mismo fallo, y creo que debe ser por algún fallo en el paso de valor...
__________________
Going hard for too long... Can't get enough

Etiquetas: arraylist, string, valor
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:48.