19 de noviembre de 2020

Colecciones (Collection)

Ahora que ya somos capaces de hacer nuestras clases, interfaces y objetos, con una jerarquía que nos permite reutilizar el código eficientemente y que podemos representarlas en consola y hacer comprobaciones básicas como ver si dos objetos son equivalentes, vamos a empezar a manejar colecciones de objetos usando la interface Collection (y no un array que es la única forma que hemos visto de usar un grupo de valores). Mirando el enlace anterior podemos ver la jerarquía que tiene ésta interface.

Vamos a crearnos una colección de Vehiculos.

Primero me creo dos vehículos (código ya conocido):

String matricula = "1234ABC";
Coche coche = new Coche("Ford Fiesta", "Rojo"); // ¿por que no usar variable Vehiculo?
coche.setMatricula(matricula);
Vehiculo moto = new Moto("Suzuki", "Verde");

Después me creo una colección y uso estos vehículos para añadirlos a la colección:

Collection<Vehiculo> vehiculos = new ArrayList<>();

En este ejemplo creamos una colección vacía usando la implementación ArrayList<>(). Ahora mismo no entenderéis ésta línea, pero tendrá sentido unas entradas más adelante, por ahora simplemente aceptar que se hace así.

En las siguientes líneas vemos que se pueden añadir más objetos a la colección, lo cual es una gran ventaja en comparación con los arrays.

vehiculos.add(coche);
vehiculos.add(moto);
Las tres líneas de código anteriores son "parecidas" (sería una lista fija) a: vehiculos = Arrays.asList(coche, moto);

Vamos a imprimir todos nuestros vehículos:

System.out.println(vehiculos);

Vemos que nos imprime algo con más significado que cuando lo hacíamos con los arrays y debíamos usar Arrays.toString().

También podemos usar esta forma bastante compacta para ver los objetos en líneas distintas:

vehiculos.forEach(System.out::println);

Esto es lo que se llama método por referencia, pero tampoco lo hemos visto aún, simplemente que quede como ejemplo para ir usándolo y que quede el código más compacto.

Del mismo modo que podemos añadir elementos se pueden quitar. Aquí es fundamental el método equals, ya que la forma de encontrar el objeto a eliminar es usando ese método:

System.out.println("\nQuito la moto");
vehiculos.remove(moto);
vehiculos.forEach(System.out::println);

¿Qué pasa si usáramos un objeto igual pero no el mismo?

Me creo un objeto que sea igual al coche que tengo en la lista:

coche = new Coche("Ford Fiesta", "Blanco");
coche.setMatricula(matricula);

Ahora voy a añadirlo:

System.out.println("\nAñado nuevo coche");
vehiculos.add(coche);
vehiculos.forEach(System.out::println);

Y por último lo quito:

System.out.println("\nQuito coche " + coche);
vehiculos.remove(coche);
vehiculos.forEach(System.out::println);

Mirando el resultado parece que hubiera algún problema, pero es todo correcto si examinamos la documentación (remove elimina una instancia, la primera). Por eso es importante éste método, y no es el único caso donde se va a usar equals ni hashCode como ya se dijo en su entrada.

NOTA: Para eliminar todos deberíamos usar algo como: vehiculos.removeIf(coche::equals);

Desde ahora ya podemos manejar un conjunto de objetos como una colección usando lo que hemos visto, pero hay muchas cosas que se pueden hacer con una colección como ordenarla. Vamos a verlo en la siguiente entrada de ordenación.

No hay comentarios:

Publicar un comentario

Compárteme

Entradas populares