Una colección en java es una estructura de datos que permite almacenar muchos valores del mismo tipo, por tanto, conceptualmente es práctimacamente igual que un array. Según el uso y según si se permiten o no repeticiones, Java dispone de un amplio catálogo de colecciones: ArrayList (lista), ArrayBlockingQueue (cola), HashSet (conjunto), Stack (pila) etc. Nosotros estudiaremos de momento ArrayList.
ArrayList es una estructura en forma de lista que permite almacenar elementos del mismo tipo (incluso objetos), su tamaño cambiando a medida que se añaden o se eliminan elementos.
Diferencias entre arrays y ArrayList o colecciones:
Métodos de los ArrayList:
public class EjemploArrayList01 {
public static void main(String[] args) {
ArrayList<String> a = new ArrayList<String>();
System.out.println("Nº de elementos: " + a.size());
a.add("rojo");
a.add("verde");
a.add("azul");
System.out.println("Nº de elementos: " + a.size());
a.add("blanco");
System.out.println("Nº de elementos: " + a.size());
System.out.println("El elemento que hay en la posición 0 es " + a.get(0));
System.out.println("El elemento que hay en la posición 3 es " + a.get(3));
}
}
Al crear la colección hay que indicar el tipo de dato que se almacenará en las celdas:
ArrayList<String> a = new ArrayList<String>();
ArrayList<Integer> a = new ArrayList<Integer>();
Con las colecciones, al igual que con los array se pueden utilizar los bucles para recorrer todo el array
public class EjemploArrayList02 {
public static void main(String[] args) {
ArrayList<String> a = new ArrayList<String>();
a.add("rojo");
a.add("verde");
a.add("azul");
a.add("blanco");
a.add("amarillo");
System.out.println("Contenido de la lista: ");
for(int i=0; i < a.size(); i++) {
System.out.println(a.get(i));
}
}
}
Pero trabajando con las colecciones es recomendabe usar el bucle for al estilo foreach donde la sintaxis es muy corta y no se necesita ningún indice para crear la estructura.
public class EjemploArrayList03 {
public static void main(String[] args) {
ArrayList<String> a = new ArrayList<String>();
a.add("rojo");
a.add("verde");
a.add("azul");
a.add("blanco");
a.add("amarillo");
System.out.println("Contenido de la lista: ");
for(String color: a) {
System.out.println(color);
}
}
}
Para eliminar un ArrayList se utiliza el método remove(), que se puede pasar como parámetro el indice del elemento que se quiere eliminar, o bien el valor del elemento.
public class EjemploArrayList04 {
public static void main(String[] args) {
ArrayList<String> a = new ArrayList<String>();
a.add("rojo");
a.add("verde");
a.add("azul");
a.add("blanco");
a.add("amarillo");
a.add("blanco");
System.out.println("Contenido de la lista: ");
for(String color: a) {
System.out.println(color);
}
if (a.contains("blanco")) {
System.out.println("El blanco está en la lista de colores");
}
a.remove("blanco");
System.out.println("Contenido de la lista después de quitar la " +
"primera ocurrencia del color blanco: ");
for(String color: a) {
System.out.println(color);
}
a.remove(2);
System.out.println("Contenido de la lista después de quitar el " +
"elemento de la posición 2: ");
for(String color: a) {
System.out.println(color);
}
}
}
Veamos un ejemplo ahora que “machaca” una posición del ArrayList. Para esto se utilza set(indice, elemento).
public class EjemploArrayList05 {
public static void main(String[] args) {
ArrayList<String> a = new ArrayList<String>();
a.add("rojo");
a.add("verde");
a.add("azul");
a.add("blanco");
a.add("amarillo");
System.out.println("Contenido del vector: ");
for(String color: a){
System.out.println(color);
}
a.set(2, "turquesa");
System.out.println("Contenido del vector después de machacar la posición 2: ");
for(String color: a) {
System.out.println(color);
}
}
}
En este ejemplo veremos tambien como añadir un nuevo elemento en la posición indicada, desplazando los demás elementos hacia derecha.
Una colección ArrayList puede contener objetos que son instancias de clases definidas por el programador. Esto es muy util en aplicaciones de gestión. Veamos un ejemplo de lista de perros, donde cada celda de la lista almacenará un objeto de la clase Perro.
public class EjemploArrayList06 {
public static void main(String[] args) {
ArrayList<String> a = new ArrayList<String>();
a.add("rojo");
a.add("verde");
a.add("azul");
a.add("blanco");
a.add("amarillo");
System.out.println("Contenido de la lista: ");
for(String color: a) {
System.out.println(color);
}
a.add(1, "turquesa");
System.out.println("Contenido del vector después de insertar en la posición 1: ");
for(String color: a) {
System.out.println(color);
}
}
}
public class EjemploArrayList07 {
public static void main(String[] args) {
ArrayList<Gato> g = new ArrayList<Gato>();
g.add(new Gato("Garfield", "naranja", "mestizo"));
g.add(new Gato("Pepe", "gris", "angora"));
g.add(new Gato("Mauri", "blanco", "manx"));
g.add(new Gato("Ulises", "marrón", "persa"));
System.out.println("\nDatos de los gatos:\n");
for (Gato gatoAux: g) {
System.out.println(gatoAux+"\n");
}
}
}
Los elementos de una lista se pueden ordenar con el método sort de tal forma:
Collections.sort(lista);
Donde sort es un método de la clase que está definido en Collections. Para utilizar este método hay que importar
import java.util.Collections;
public class EjemploArrayList08 {
public static void main(String[] args) {
ArrayList<Integer> a = new ArrayList<Integer>();
a.add(67);
a.add(78);
a.add(10);
a.add(4);
System.out.println("\nNúmeros en el orden original:");
for (int numero: a) {
System.out.println(numero);
}
Collections.sort(a);
System.out.println("\nNúmeros ordenados:");
for (int numero: a) {
System.out.println(numero);
}
}
}
Tamibién es posible ordenar una lista de objetos. En este caso es necesario indicar el criterio de ordenación en la definición de la clsase. En el programa principal se utiliza el método sort al igual que se tratase de una lista de números o palabras.
public class EjemploArrayList08 {
public static void main(String[] args) {
ArrayList<Gato> g = new ArrayList>Gato>();
g.add(new Gato("Garfield", "naranja", "mestizo"));
g.add(new Gato("Pepe", "gris", "angora"));
g.add(new Gato("Mauri", "blanco", "manx"));
g.add(new Gato("Ulises", "marrón", "persa"));
g.add(new Gato("Adán", "negro", "angora"));
Collections.sort(g);
System.out.println("\nDatos de los gatos ordenados por nombre:");
for (Gato gatoAux: g) {
System.out.println(gatoAux+"\n");
}
}
}
Luego hay que definir el método compareTo. Este método devolverá un o si los elementos que comparan son iguales, o un número negativo si el primer elemento que se compara es menors que el segundo, o un número positivo en caso contrario. Lo único que debemos escribir en nuestro código es un compareTo con los atributos que queremos comparar.
public class Gato implements Comparable<Gato> {
private String nombre;
private String color;
private String raza;
public Gato(String nombre, String color, String raza) {
this.nombre = nombre;
this.color = color;
this.raza = raza;
}
public String getNombre() {
return nombre;
}
public String getRaza() {
Colecciones y diccionarios 138
return raza;
}
public String toString() {
return "Nombre: " + this.nombre + "\nColor: " + this.color + "\nRaza: " + this.raza;
}
public int compareTo(Gato g) {
return (this.nombre).compareTo(g.getNombre());
}
public boolean equals(Gato g) {
return (this.nombre).equals(g.getNombre());
}
}