ArrayList en Java
ArrayList en Java
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:
nombreArrayList.add("Elemento");
nombreArrayList.size();
nombreArrayList.get(2);
nombreArrayList.contains("Elemento");
nombreArrayList.lastIndexOf("Elemento");
nombreArrayList.remove(5);
nombreArrayList.remove("Elemento");
nombreArrayList.clear();
nombreArrayList.isEmpty();
// Copiar un ArrayList
Otra 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.
// Declaración el ArrayList
nombreArrayList.add("Elemento "+i);
while(nombreIterator.hasNext()){
System.out.print(elemento+" / ");
nombreArrayList.remove(0);
nombreIterator = nombreArrayList.iterator();
while(nombreIterator.hasNext()){
if(elemento.equals("Elemento 3"))
nombreIterator = nombreArrayList.iterator();
while(nombreIterator.hasNext()){
System.out.print(elemento+" / ");
}
numElementos = nombreArrayList.size();
... Eliminamos los elementos de ArrayList que sean iguales a "Elemento 3" ...
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.
return equipoLocal;
this.equipoLocal = equipoLocal;
return equipoVisitante;
this.equipoVisitante = equipoVisitante;
return golesLocal;
}
this.golesLocal = golesLocal;
return 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.
Scanner s = null;
try {
s = new Scanner(fichero);
while (s.hasNextLine()){
partido.setEquipoLocal(cortarString[0]);
partido.setEquipoVisitante(cortarString[1]);
partido.setGolesLocal(Integer.parseInt(cortarString[2]));
partido.setGolesVisitante(Integer.parseInt(cortarString[3]));
partidos.add(partido);
} catch (Exception e) {
e.printStackTrace();
} finally{
try {
if (s != null)
s.close();
e2.printStackTrace();
Con este código que mostramos tambien se puede ver de que forma se puede leer
un fichero de texto y tratar los datos . 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:
while(itrPartidos.hasNext()){
+ partido.getGolesLocal() + "-"
+ partido.getEquipoVisitante());
Ahora 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:
// no sea un empate
itrPartidos = partidos.iterator();
while(itrPartidos.hasNext()){
if(partido.getGolesLocal() != partido.getGolesVisitante())
itrPartidos.remove();
itrPartidos = partidos.iterator();
while(itrPartidos.hasNext()){
+ partido.getGolesLocal() + "-"
+ 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:
... Eliminamos los partidos de futbol cuyo resultado no sea un empate ...
Con 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
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 8
1 2 3 7
6 9 8 9 6
7 9
8 7 8 9 8
Es 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:
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:
Scanner s = null;
try {
s = new Scanner(fichero);
while (s.hasNextLine()){
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();
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 ArrayLis
t de
while(itrArrayListNumeros.hasNext()){
while(itrNumeros.hasNext()){
System.out.println();
// Recorremos los ArrayList que hay en el ArrayList y eliminamos los numeros que
son cero
itrArrayListNumeros = arrayListNumeros.iterator();
while(itrArrayListNumeros.hasNext()){
while(itrNumeros.hasNext()){
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:
// contengan elementos
itrArrayListNumeros = arrayListNumeros.iterator();
while(itrArrayListNumeros.hasNext()){
ArrayList<Integer> numeros = itrArrayListNumeros.next();
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:
itrArrayListNumeros = arrayListNumeros.iterator();
while(itrArrayListNumeros.hasNext()){
while(itrNumeros.hasNext()){
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 8
Con 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.
Recomendados
•
o Reflection en Java
•
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
1. Bi dice:
cc.agregar(new Casa());
cc.agregar(new Fabrica());
cc.agregar(new Casa());
cc.agregar(new Fabrica());
Ahora lo que me pide el ejercicio es contar la
cantidad de objetos iguales.Yo tendria que hacer un
metodo :
System.out.println(contCasa);
}