ArrayList en Java, con ejemplos
La clase ArrayList en Java, es una clase que permite
almacenar datos en memoria de forma similar a los Arrays, con la ventaja
de que el numero de elementos que almacena, lo hace de forma dinámica,
es decir, que no es necesario declarar su tamaño como pasa con los
Arrays. Para todos aquellos que hayáis estudiado en alguna asignatura
las estructuras de datos de las Pilas, Colas, Listas, Arboles (AVL, B,
B+, B*) etc. hay decir que los ArrayList “tiran por tierra” toda la
teoria que hay detrás de esas estructuras de datos ya que los ArrayList
nos permiten añadir, eliminar y modificar elementos (que pueden ser
objetos o elementos atómicos) de forma trasparente para el programador.
Antes de pasar a explicar el manejo de los ArrayList, dejamos un enlace
al JavaDoc, pulsando AQUI.
Antes de todo, decir que el código de todos los ejemplos que se ponen a continuación los podeis descargar pulsando AQUI.
Los principales métodos para trabajar con los ArrayList son los siguientes:
Bueno, si esto no te ha quedado muy claro, pasamos a poner el primer ejemplo. En el siguiente fragmento de código, declaramos un ArrayList de Strings y lo rellenamos con 10 Strings (Elemento i). Esto lo hacemos con el método “add()”. Después añadimos un nuevo elemento al ArrayList en la posición ’2′ (con el metodo “add(posición,elemento)”) que le llamaremos “Elemento 3″ y posteriormente imprimiremos el contenido del ArrayList, recorriendolo con un Iterador. El fragmento de este código es el siguiente:
Bueno todo lo que hemos visto esta muy bien, pero por lo general los ArrayList se suelen utilizar con objetos más que con estructuras atómicas de datos, ya que los ArrayList en Java son estructuras muy potentes y sencillas de manejar.
Ahora vamos a poner un ejemplo de la utilización de ArrayList con Objetos. Para ello nos vamos ha crear una clase llamada “PartidoFutbol” que utilizaremos para crearnos objetos de esa clase que almacenaremos en el ArrayList. En primer lugar mostramos la clase “PartidoFutbol” que es la siguiente:
A continuación se muestra el código de la lectura de los partidos de fútbol y como los almacenamos en un ArrayList. Por curiosidad, un partido de fútbol esta guardado en el fichero con la siguiente estructura: equipoLocal::equipoVisitante::golesLocal::golesVisitante
. Una vez ejecutado este código tenemos guardado en el ArrayList “partidos”,
50 partidos de fútbol. Ahora recorremos el ArrayList con un Iterator y
mostramos por pantalla todos los resultados de fútbol. Esto lo hacemos
igual que antes, con el Iterator:
Por último vamos a rizar el rizo y vamos a poner un ejemplo de como trabajar con ArrayList de ArrayList. Para ello vamos ha hacer un ejemplo que en principio puede parecer complejo pero que en realizar no lo es, solo es un poco lioso y hay que ir con cuidado. INTENTA HACER POR TU CUENTA ESTE EJERCICIO ANTES DE MIRARLO, PORQUE SI LO CONSIGUES HACER, NO HABRA TRABAJO CON ARRAYLIST QUE SE TE RESISTA
El ejercicio es el siguiente. Dado un fichero con una serie de números, hay que eliminar todos los ceros que hay en el fichero, y si una linea esta llena de ceros, hay que eliminar la linea. En este caso tenemos en el fichero el contenido siguiente:
Ahora lo que vamos ha hacer es recorrer el ArrayList de ArrayList de Enteros, y eliminaremos de los ArrayList, todos los elementos que tengan como contenido ’0′. Esto lo hacemos de la siguiente forma:
El código de todos estos ejemplos (junto con los ficheros correspondientes) los podeis descargar desde AQUI.
Cualquier duda, no dudéis en preguntarla dejando un comentario.
Antes de todo, decir que el código de todos los ejemplos que se ponen a continuación los podeis descargar pulsando AQUI.
Los principales métodos para trabajar con los ArrayList son los siguientes:
// Declaración de un ArrayList de "String". Puede ser de cualquier otro Elemento u Objeto (float, Boolean, Object, ...) ArrayList<String> nombreArrayList = new ArrayList<String>(); nombreArrayList.add("Elemento"); // Añade el elemento al ArrayList nombreArrayList.add(n, "Elemento 2"); // Añade el elemento al ArrayList en la posición 'n' nombreArrayList.size(); // Devuelve el numero de elementos del ArrayList nombreArrayList.get(2); // Devuelve el elemento que esta en la posición '2' del ArrayList nombreArrayList.contains("Elemento"); // Comprueba se existe del elemento ('Elemento') que se le pasa como parametro nombreArrayList.indexOf("Elemento"); // Devuelve la posición de la primera ocurrencia ('Elemento') en el ArrayList nombreArrayList.lastIndexOf("Elemento"); // Devuelve la posición de la última ocurrencia ('Elemento') en el ArrayList nombreArrayList.remove(5); // Borra el elemento de la posición '5' del ArrayList nombreArrayList.remove("Elemento"); // Borra la primera ocurrencia del 'Elemento' que se le pasa como parametro. nombreArrayList.clear(); //Borra todos los elementos de ArrayList nombreArrayList.isEmpty(); // Devuelve True si el ArrayList esta vacio. Sino Devuelve False ArrayList arrayListCopia = (ArrayList) nombreArrayList.clone(); // Copiar un ArrayList Object[] array = nombreArrayList.toArray(); // Pasa el ArrayList a un ArrayOtra cosa muy importante a la hora de trabajar con los ArrayList son los “Iteradores” (Iterator). Los Iteradores sirven para recorrer los ArrayList y poder trabajar con ellos. Los Iteradores solo tienen tres métodos que son el “hasNext()” para comprobar que siguen quedando elementos en el iterador, el “next()” para que nos de el siguiente elemento del iterador; y el “remove()” que sirve para eliminar el elemento del Iterador.
Bueno, si esto no te ha quedado muy claro, pasamos a poner el primer ejemplo. En el siguiente fragmento de código, declaramos un ArrayList de Strings y lo rellenamos con 10 Strings (Elemento i). Esto lo hacemos con el método “add()”. Después añadimos un nuevo elemento al ArrayList en la posición ’2′ (con el metodo “add(posición,elemento)”) que le llamaremos “Elemento 3″ y posteriormente imprimiremos el contenido del ArrayList, recorriendolo con un Iterador. El fragmento de este código es el siguiente:
// Declaración el ArrayList ArrayList<String> nombreArrayList = new ArrayList<String>(); // Añadimos 10 Elementos en el ArrayList for (int i=1; i<=10; i++){ nombreArrayList.add("Elemento "+i); } // Añadimos un nuevo elemento al ArrayList en la posición 2 nombreArrayList.add(2, "Elemento 3"); // Declaramos el Iterador e imprimimos los Elementos del ArrayList Iterator<String> nombreIterator = nombreArrayList.iterator(); while(nombreIterator.hasNext()){ String elemento = nombreIterator.next(); System.out.print(elemento+" / "); }Ejecutando esta código obtenemos por pantalla lo siguiente:
Elemento 1 / Elemento 2 / Elemento 3 / Elemento 3 / Elemento 4 / Elemento 5 / Elemento 6 / Elemento 7 / Elemento 8 / Elemento 9 / Elemento 10 /Como se observa en el resultado tenemos repetido el elemento “Elemento 3″ dos veces y esto lo hemos puesto a proposito para mostrar el siguiente ejemplo. Ahora para seguir trabajando con los ArrayList, lo que vamos ha hacer es mostrar el numero de elementos que tiene el ArrayList y después eliminaremos el primer elemento del ArrayList y los elementos del ArrayList que sean iguales a “Elemento 3″, que por eso lo hemos puesto repetido. El “Elemento 3″ lo eliminaremos con el metodo “remove()” del iterador. A continuación mostramos el código que realiza lo descrito:
// Recordar que previamente ya hemos declarado el ArrayList y el Iterator de la siguiente forma: // ArrayList<String> nombreArrayList = new ArrayList<String>(); // Iterator<String> nombreIterator = nombreArrayList.iterator(); // Obtenemos el numero de elementos del ArrayList int numElementos = nombreArrayList.size(); System.out.println("\n\nEl ArrayList tiene "+numElementos+" elementos"); // Eliminamos el primer elemento del ArrayList, es decir el que ocupa la posición '0' System.out.println("\n... Eliminamos el primer elemento del ArrayList ("+nombreArrayList.get(0)+")..."); nombreArrayList.remove(0); // Eliminamos los elementos de ArrayList que sean iguales a "Elemento 3" System.out.println("\n... Eliminamos los elementos de ArrayList que sean iguales a \"Elemento 3\" ..."); nombreIterator = nombreArrayList.iterator(); while(nombreIterator.hasNext()){ String elemento = nombreIterator.next(); if(elemento.equals("Elemento 3")) nombreIterator.remove(); // Eliminamos el Elemento que hemos obtenido del Iterator } // Imprimimos el ArrayList despues de eliminar los elementos iguales a "Elemento 3" System.out.println("\nImprimimos los elementos del ArrayList tras realizar las eliminaciones: "); nombreIterator = nombreArrayList.iterator(); while(nombreIterator.hasNext()){ String elemento = nombreIterator.next(); System.out.print(elemento+" / "); } // Mostramos el numero de elementos que tiene el ArrayList tras las eliminaciones: numElementos = nombreArrayList.size(); System.out.println("\nNumero de elementos del ArrayList tras las eliminaciones = "+numElementos);Como salida a este código tenemos lo siguiente:
El ArrayList tiene 11 elementos ... Eliminamos el primer elemento del ArrayList (Elemento 1)... ... Eliminamos los elementos de ArrayList que sean iguales a "Elemento 3" ... Imprimimos los elementos del ArrayList tras realizar las eliminaciones: Elemento 2 / Elemento 4 / Elemento 5 / Elemento 6 / Elemento 7 / Elemento 8 / Elemento 9 / Elemento 10 / Numero de elementos del ArrayList tras las eliminaciones = 8Si os fijais, hemos eliminado 3 elementos del ArrayList de dos formas distintas, preguntando por la posición que ocupa un elemento en el ArrayList y preguntando por el contenido de algún elemento del ArrayList. Como se observa es muy importante saber manejar los Iteradores ya que con ellos podemos tratar los elementos del ArrayList.
Bueno todo lo que hemos visto esta muy bien, pero por lo general los ArrayList se suelen utilizar con objetos más que con estructuras atómicas de datos, ya que los ArrayList en Java son estructuras muy potentes y sencillas de manejar.
Ahora vamos a poner un ejemplo de la utilización de ArrayList con Objetos. Para ello nos vamos ha crear una clase llamada “PartidoFutbol” que utilizaremos para crearnos objetos de esa clase que almacenaremos en el ArrayList. En primer lugar mostramos la clase “PartidoFutbol” que es la siguiente:
package ArrayList_Objetos; public class PartidoFutbol { private String equipoLocal; private String equipoVisitante; private int golesLocal; private int golesVisitante; public String getEquipoLocal() { return equipoLocal; } public void setEquipoLocal(String equipoLocal) { this.equipoLocal = equipoLocal; } public String getEquipoVisitante() { return equipoVisitante; } public void setEquipoVisitante(String equipoVisitante) { this.equipoVisitante = equipoVisitante; } public int getGolesLocal() { return golesLocal; } public void setGolesLocal(int golesLocal) { this.golesLocal = golesLocal; } public int getGolesVisitante() { return golesVisitante; } public void setGolesVisitante(int golesVisitante) { this.golesVisitante = golesVisitante; } }Lo que vamos ha hacer ahora en este ejemplo, es leer desde un fichero de texto, una serie de partidos de fútbol que guardaremos en un ArrayList de objetos “PartidoFutbol”. Al utilizar el ArrayList, nos da igual el numero de partidos de fútbol que haya en el fichero de texto ya que los ArrayList como vimos al principio son dinámicos. Para este caso os adelante que hay 50 partidos de fútbol en el fichero, pero nos daria igual cuantos podría haber.
A continuación se muestra el código de la lectura de los partidos de fútbol y como los almacenamos en un ArrayList. Por curiosidad, un partido de fútbol esta guardado en el fichero con la siguiente estructura: equipoLocal::equipoVisitante::golesLocal::golesVisitante
// Nos creamos un ArrayList de objetos de la Clase "PartidoFutbol" System.out.println("... Nos creamos un ArrayList de objetos de la Clase \"PartidoFutbol\" ..."); ArrayList<PartidoFutbol> partidos = new ArrayList<PartidoFutbol>(); // Instanciamos el fichero donde estan los datos File fichero = new File(nombreFichero); Scanner s = null; try { // Leemos el contenido del fichero System.out.println("... Leemos el contenido del fichero ..."); s = new Scanner(fichero); // Obtengo los datos de los partidos de fútbol del fichero while (s.hasNextLine()){ String linea = s.nextLine(); // Obtengo una linea del fichero (un partido de fútbol) String [] cortarString = linea.split("::"); // Obtengo los datos del partido de futbol PartidoFutbol partido = new PartidoFutbol(); // Creo un objeto de la clase "PartidoFutbol" // Pongo los atributos al objeto "partido" partido.setEquipoLocal(cortarString[0]); partido.setEquipoVisitante(cortarString[1]); partido.setGolesLocal(Integer.parseInt(cortarString[2])); partido.setGolesVisitante(Integer.parseInt(cortarString[3])); // Añadimos el objeto "partido" al ArrayList partidos.add(partido); } } catch (Exception e) { e.printStackTrace(); } finally{ try { if (s != null) s.close(); } catch (Exception e2) { e2.printStackTrace(); } } System.out.println("... Guardados "+partidos.size()+" partidos de fútbol ...");Con este código que mostramos tambien se puede ver de que forma se puede leer un fichero de texto y tratar los datos
System.out.println("\n... Resultados de los partidos de Futbol ..."); Iterator<PartidoFutbol> itrPartidos = partidos.iterator(); while(itrPartidos.hasNext()){ PartidoFutbol partido = itrPartidos.next(); System.out.println(partido.getEquipoLocal() + " " + partido.getGolesLocal() + "-" + partido.getGolesVisitante() + " " + partido.getEquipoVisitante()); }Como salida a la ejecución de este código tenemos lo siguiente:
... Resultados de los partidos de Futbol ... Valencia 1-0 Betis Betis 1-0 Osasuna Atletico Madrid 0-0 Zaragoza Zaragoza 2-2 Valencia Mallorca 0-1 Deportivo Deportivo 1-0 Atletico Madrid . . . Mallorca 1-4 Malaga Malaga 0-2 Atletico MadridAhora vamos a eliminar del ArrayList, todos los partidos que no tengan como resultado un empate. De esta forma trabajaremos de nuevo con el iterator. Esto lo hacemos de la siguiente forma:
// Eliminamos los partidos de futbol del ArrayList, cuyo resultado // no sea un empate System.out.println("\n... Tamaño del ArrayList antes de eliminar partidos de futbol = "+partidos.size()+" ..."); System.out.println("\n... Eliminamos los partidos de futbol cuyo resultado no sea un empate ..."); itrPartidos = partidos.iterator(); while(itrPartidos.hasNext()){ PartidoFutbol partido = itrPartidos.next(); // Si los goles no son iguale, eliminamos el partido if(partido.getGolesLocal() != partido.getGolesVisitante()) itrPartidos.remove(); } // Imprimimos los elementos del ArrayList System.out.println("\n... Tamaño del ArrayList despues de eliminar partidos de futbol = "+partidos.size()+" ..."); System.out.println("\n... Resultados de los partidos de Futbol con empate ..."); itrPartidos = partidos.iterator(); while(itrPartidos.hasNext()){ PartidoFutbol partido = itrPartidos.next(); System.out.println(partido.getEquipoLocal() + " " + partido.getGolesLocal() + "-" + partido.getGolesVisitante() + " " + partido.getEquipoVisitante()); }Como resultado al ejecutar este código tenemos lo siguiente, que como se observa el ArrayList solo se ha quedado con los partidos de fútbol en los que ha habido un empate:
... Tamaño del ArrayList antes de eliminar partidos de futbol = 50 ... ... Eliminamos los partidos de futbol cuyo resultado no sea un empate ... ... Tamaño del ArrayList despues de eliminar partidos de futbol = 16 ... ... Resultados de los partidos de Futbol con empate ... Atletico Madrid 0-0 Zaragoza Zaragoza 2-2 Valencia Alaves 0-0 Barcelona Getafe 1-1 Athletic Villarreal 1-1 Sevilla Betis 0-0 Zaragoza Valencia 2-2 Deportivo Deportivo 1-1 Betis Barcelona 2-2 Valencia Getafe 1-1 Mallorca Malaga 0-0 Alaves Cadiz 1-1 Villarreal Sevilla 0-0 Cadiz Zaragoza 1-1 Deportivo Barcelona 2-2 Zaragoza Real Sociedad 1-1 BetisCon esto ya hemos visto como manejar los ArrayList y hemos visto los métodos mas importantes para ello. Con todo esto ya esta casi todo contado sobre los ArrayList en Java. Ahora solo queda coger soltura y trabajar con ello.
Por último vamos a rizar el rizo y vamos a poner un ejemplo de como trabajar con ArrayList de ArrayList. Para ello vamos ha hacer un ejemplo que en principio puede parecer complejo pero que en realizar no lo es, solo es un poco lioso y hay que ir con cuidado. INTENTA HACER POR TU CUENTA ESTE EJERCICIO ANTES DE MIRARLO, PORQUE SI LO CONSIGUES HACER, NO HABRA TRABAJO CON ARRAYLIST QUE SE TE RESISTA
El ejercicio es el siguiente. Dado un fichero con una serie de números, hay que eliminar todos los ceros que hay en el fichero, y si una linea esta llena de ceros, hay que eliminar la linea. En este caso tenemos en el fichero el contenido siguiente:
1 2 0 3 0 7 0 0 0 0 0 6 9 8 0 9 6 0 0 0 0 7 9 0 0 0 0 0 0 0 8 7 0 8 9 0 8Y lo que hay que conseguir es trasformar esos datos en los siguientes:
1 2 3 7 6 9 8 9 6 7 9 8 7 8 9 8Es decir se eliminan todos los ceros y como las filas 2 y 5 contienen todo ceros, se han de eliminar esas filas. Para ello nos tenemos que declarar un ArrayList de ArrayList de enteros de la siguiente forma:
ArrayList<ArrayList<Integer>> arrayListNumeros = new ArrayList<ArrayList<Integer>>();Lo siguiente que haremos sera leer los números del fichero y nos crearemos por cada fila un ArrayList de enteros en el que guardaremos cada número en una posición del ArrayList y luego guardaremos ese ArrayList en el ArrayList que hemos llamado “arrayListNumeros”. Esto lo hacemos de la siguiente forma:
// Instanciamos el fichero donde estan los datos File fichero = new File(nombreFichero); Scanner s = null; try { // Leemos el contenido del fichero System.out.println("... Leemos el contenido del fichero ..."); s = new Scanner(fichero); // Obtengo los datos de los partidos de fútbol del fichero while (s.hasNextLine()){ String linea = s.nextLine(); // Obtengo una linea del fichero con los numeros String [] cortarString = linea.split(" "); // Obtengo los numeros de la linea en un array ArrayList<Integer> numeros = new ArrayList<Integer>(); // Pongo los numeros de la fila en el ArrayList for (int i=0; i<cortarString.length; i++){ numeros.add(Integer.parseInt(cortarString[i])); } // Añado el ArrayList de enteros al ArratList de ArrayList arrayListNumeros.add(numeros); } } catch (Exception e) { e.printStackTrace(); } finally{ try { if (s != null) s.close(); } catch (Exception e2) { e2.printStackTrace(); } }Para comprobar que hemos copiado bien los datos y para recorrer el ArrayList de ArrayList de Enteros, vamos a imprimir por pantalla el contenido del ArrayList y lo hacemos de la siguiente forma:
// Para ver que hemos leido bien los numeros del fichero, recorremos el ArrayList de // ArrayList y lo mostramos por pantalla. System.out.println("\n... Contenido de los ArrayList del ArrayList ..."); Iterator<ArrayList<Integer>> itrArrayListNumeros = arrayListNumeros.iterator(); while(itrArrayListNumeros.hasNext()){ ArrayList<Integer> numeros = itrArrayListNumeros.next(); Iterator<Integer> itrNumeros = numeros.iterator(); while(itrNumeros.hasNext()){ int numero = itrNumeros.next(); System.out.print(numero+" "); } System.out.println(); }Como salida tenemos el contenido del fichero.
Ahora lo que vamos ha hacer es recorrer el ArrayList de ArrayList de Enteros, y eliminaremos de los ArrayList, todos los elementos que tengan como contenido ’0′. Esto lo hacemos de la siguiente forma:
// Recorremos los ArrayList que hay en el ArrayList y eliminamos los numeros que son cero itrArrayListNumeros = arrayListNumeros.iterator(); while(itrArrayListNumeros.hasNext()){ ArrayList<Integer> numeros = itrArrayListNumeros.next(); Iterator<Integer> itrNumeros = numeros.iterator(); while(itrNumeros.hasNext()){ int numero = itrNumeros.next(); if (numero == 0) itrNumeros.remove(); } }Ahora borramos del ArrayList, los ArrayLit que están vacíos, preguntando con el método “isEmpty()”. Esto lo hacemos de la siguiente forma:
// Recorremos el ArrayList de los ArrayList y eliminamos los ArrayList que no // contengan elementos itrArrayListNumeros = arrayListNumeros.iterator(); while(itrArrayListNumeros.hasNext()){ ArrayList<Integer> numeros = itrArrayListNumeros.next(); // Si el ArrayList esta vacio, lo eliminamos del ArrayList if (numeros.isEmpty()) itrArrayListNumeros.remove(); }Con todo esto ya hemos eliminado los ceros, y los ArrayList que estaban vacíos. Ahora solo queda recorrer de nuevo el ArrayList de ArrayList y mostrar el contenido tras realizar las eliminaciones de ceros. Esto lo hacemos de la siguiente manera:
// Mostramos el ArrayList tras eliminar todos los ceros String salida = ""; System.out.println("\n... Salida sin ceros ..."); itrArrayListNumeros = arrayListNumeros.iterator(); while(itrArrayListNumeros.hasNext()){ ArrayList<Integer> numeros = itrArrayListNumeros.next(); Iterator<Integer> itrNumeros = numeros.iterator(); while(itrNumeros.hasNext()){ int numero = itrNumeros.next(); salida += numero+" "; } salida += "\n"; } System.out.println(salida);Tras ejecutar este código, vemos que tenemos la salida esperada, que es la siguiente:
1 2 3 7 6 9 8 9 6 7 9 8 7 8 9 8Con todo esto ya hemos visto prácticamente todo sobre los ArrayList, con ejemplo de como tratarlos con elementos atómicos (String, int, float, double, …) y con objetos y sobre todo ver como se trabaja con ArrayList de ArrayList que como se ha visto la complejidad esta en saber recorrer esa estructura de datos.
El código de todos estos ejemplos (junto con los ficheros correspondientes) los podeis descargar desde AQUI.
Cualquier duda, no dudéis en preguntarla dejando un comentario.
Entradas Relacionadas
Entrada publicada el: 28/marzo/2013
Categoria: Lenguajes de Programación
ArrayList en Java, con ejemplos por "www.jarroba.com" esta bajo una licencia Creative Commons
Reconocimiento-NoComercial-CompartirIgual 3.0 Unported License.
Creado a partir de la obra en www.jarroba.com
se agradece!!!
Muy bueno tu post, pero tengo una pregunta, cuando digo que quiero imprimir los datos contenidos en mi ArrayList
System.out.println(“Primera Posición”+lstUnidades.get(3));
En este caso la posicion 3, obtengo lo siguiente:
“Primera PosiciónModelo.VOUnidadMedida@23e94776″
¿Cómo logro acceder al dato? Esta parece la dirección del objeto pero no su contenido, ¿Por qué se presenta esto?
Te agradezco un montón!
Entiendo que “lstUnidades” es un arrayList de objetos de alguna clase que tu te has creado. Entonces lo que te esta dando es ese objeto en un string. Si por ejemplo ese objeto tuviese un atributo “nombre” y tuvieses el método get implementado (ejm: getNombre) para imprimir tendrías que poner lo siguiente:
System.out.println(“Primera Posición”+lstUnidades.get(3).getNombre());
De esta forma se te imprimiria el atributo nombre del objeto.
Supongo que es eso lo que te pasa, pero con la información que me das no te puedo ayudar mas. Cualquier cosa vuelve a escribir.
SL2
como podria borrar un nombre mandandole yo la posicion que quiero borrar ?
Cuando te refieres a arreglo no array, ¿a que tipo de estructura de datos te refieres? ¿List, ArrayList, HashMap, etc? Normalmente todas las estructuras de datos tienen alguna función de eliminación de elementos.
Después, sobre lo que comentas de la compatibilidad String con int, huele a que estás comparando justo eso. Prueba un truco sencillo, que es en el momento de la comparación y si la variables se llaman X e Y, sumarles unas comillas vacías; es decir, hacer un X+”" y un Y+”" , con esto conviertes a String las dos variables y no deberías de tener problemas. También recuerda que para comparar Strings se hace con la función equals(), como por ejemplo:
(X+”").equals(Y+”")
mucho ánimo a este mundo de Java, ya verás como es apasionante y en poco te convertirás en todo un experto
Y ya sabes que puedes contar con nosotros ante cualquier duda que necesites aclarar.
SL2
Excelente la data que han posteado.
Les detallo: necesito un programa que lea objetos de tipo container, que tienen algunos atributos a saber: nombre, puerto de carga, puerto de descarga, tipo y peso, y que luego me los muestre por pantalla.
Yo ya hice la clase “Containers” en donde desarrollé, como ustedes aca con los partidos, los atributos del objeto container:
Variables
nombre: de tipo string
puertoCarga: tipo string
puertoDescarga: tipo string
tipo: tipo integer (ya que necesito saber si son de 20 o de 40 nomás) (calculo que también podría ser boolean)
peso: de tipo float
y sus “Getters” and “Setters”
con eso tengo la clase para luego poder crear objetos de tipo Container con los atributos mencionados.
hasta ahí todo bien, el problema está en que en el main desarrollé los métodos “cargarcontainers” y “mostrarcontainers” y, o me da un error la ejecución o no me da lo que necesito, y el tema es que es tan tonto lo que necesito que me da hasta verguenza no saber resolverlo! y seguro que la solución la tengo al alcance de la mano pero no logro darme cuenta, por eso, me tomo el atrevimiento de copiarles mi código para ver si ustedes pueden explicarme cuál es mi error:
import java.util.*;
public class Principal{
static ArrayList containers = new ArrayList (); //Aca voy a guardar los containers que vaya leyendo
static Scanner sc = new Scanner (System.in); //Scanner para leer datos de teclado
public static void main (String [] args){
cargarContainers();
System.out.println(“”);
System.out.println(“Lista de containers:”);
System.out.println(“Containers: ” + containers.size());
System.out.println(“”);
mostrarContainers();
System.out.println(“”);
System.out.println(“Todos los containers han sido mostrados!”);
}//Fin del método Main
public static void cargarContainers (){
String nombre;
String puertoCarga;
String puertoDescarga;
int tipo;
int peso;
int N;
Containers aux = new Containers ();
System.out.println(“Ingrese el número de Containers para cargar: “);
N=sc.nextInt();
for (int i=0; i<N; i++){
sc.nextLine();
System.out.println("");
System.out.println("Container N° " + (i+1) + " : ");
System.out.println("Nombre: ");
nombre = sc.nextLine();
aux.setNombre(nombre);
System.out.println("Puerto de Carga: ");
puertoCarga = sc.nextLine();
aux.setPuertoCarga(puertoCarga);
System.out.println("Puerto de Descarga: ");
puertoDescarga = sc.nextLine();
aux.setPuertoDescarga(puertoDescarga);
System.out.println("Tipo (20 / 40): ");
tipo = sc.nextInt();
aux.setTipo(tipo);
System.out.println("Peso: ");
peso = sc.nextInt();
aux.setPeso(peso);
containers.add(aux); //Con esta orden deberían poder guardarse todos los atributos en el arraylist
}//Fin del for
}//Fin del método
public static void mostrarContainers (){
Iterator itrContainers = containers.iterator();
while(itrContainers.hasNext()){
Containers aux = itrContainers.next();
System.out.println(aux.getNombre()+ ” ”
+ aux.getPuertoCarga() + “-”
+ aux.getPuertoDescarga() + ” ”
+ aux.getPeso() + ” ”
+ aux.getTipo());
}
}
}//Fin de la clase principal
Resulta que cuando ejecuto el programa me da el número exacto de los containers cargados, pero si cargué digamos 5 containers, me imprime por pantalla el último cargado 5 veces seguidas y no 1 vez cada uno!!!
Perdón por la extensión, pero me vendría genial que puedan ayudarme con este problemita!
Desde ya muchísimas gracias!
El problema que tienes es que el objeto aux del tipo Containers en el ArrayList es referenciado (referenciado es que apunta al objeto, no que guarda una copia del mismo). Como solo haces un new Container() antes del for este se guarda la referencia la primera vez en el ArrayList con los datos que le has puesto; la siguiente vez se guarda en el mismo objeto otros datos y se referencia el mismo objeto en otra posición del ArrayList. Hasta aquí tenemos un mismo objeto referenciado dos veces por el ArrayList, por lo que en todas las posiciones del ArrayList obtenemos los mismos datos. La solución, simplemente añade el Containers aux = new Containers(); dentro del for al principio de este para que se cree un nuevo objeto para cada referencia de cada posición del ArrayList.
Otra recomendación, parametriza el ArrayList y el Iterator siempre:
static ArrayList containers = new ArrayList();
Iterator itrContainers = containers.iterator();
Tengo 4 arrayList :
String datos=””;
private ArrayList concepto = new ArrayList();
private ArrayList persona = new ArrayList();
private ArrayList pago = new ArrayList();
private ArrayList Concatenacion_concepto = new ArrayList();
/*
La variable concepto es para el eje x
La variable persona es para el eje y
Y la variable pago es aquella en donde algunas personas pagaron ciertas cuentas.
Uso el siguiente proceso para comparación:
*/
for (int y = 0; y < persona.size(); y++) {
datos =persona.get(y).getNombre() + ";"
+ persona.get(y).getCve_persona () + ";"
+ persona.get(y).getStatus();
for (int x = 0; x < concepto.size(); x++) {
if ((concepto.get(x).getCve_concepto() == adeudo.get(x).getCve_concepto())) {
if ((persona.get(y).getCve_persona() == adeudo.get(x).getCve_cliente())) {
datos += "; X ";
}
} else {
datos += "; O ";
}
}
Concatenacion_concepto.add(datos);
}
/*
El problema que tengo que al momento de comparar datos, me marca el siguiente error:
java.lang.IndexOutOfBoundsException: Index: 2, Size: 2
y no tengo idea de cómo compararlo ¿alguna sugerencia?
Saludos
*/
el problema que indicas es porque intentas acceder a una posición del índice del ArrayList que no existe (comprueba que los for no se pasen de los elementos que tengas almacenados en los ArrayList). De todas maneras, para recorrer ArrayList recomendamos mejor usar Iterator.
int validar = 0;
for (int y = 0; y < persona.size(); y++) {
datos = persona.get(y).getNombre() + ";"
+ persona.get(y).getCve_perosna() + ";"
+ persona.get(y).getStatus();
for (int x = 0; x < concepto.size(); x++) {
for (int z = 0; z < adeudo.size(); z++) {
if ((adeudo.get(z).getCve_cliente() == persona.get(y).getCve_persona()) && (adeudo.get(z).getCve_concepto() == concepto.get(x).getCve_concepto())) {
validar = 1;
}
}
if (validar == 1) {
datos += ";X";
} else {
datos += "; ";
}
validar = 0;
}
Concatenacion_concepto.add(datos);
datos = "";
y ya con esto me trae lo que necesito de información, de todas forma muchas gracias