7 - Guía Colecciones
7 - Guía Colecciones
7 - Guía Colecciones
COLECCIONES
PARADIGMA ORIENTADO A OBJETOS
GUÍA DE COLECCIONES
COLECCIONES
Previo a esta guía, nosotros manejábamos nuestros objetos de uno en uno, no teníamos
manera de manejar varios objetos a la vez, pero, para esto existen las colecciones.
Una colección representa un grupo de objetos. Esto objetos son conocidos como
elementos. Cuando queremos trabajar con un conjunto de elementos, necesitamos un
almacén donde poder guardarlos. Las colecciones nos dan la opción de almacenar
cualquier tipo de objeto, esto incluye los objetos de tipo de datos. Por lo que, para crear una
colección de un tipo de dato, no podremos usar los datos primitivos, sino sus objetos. Por
ejemplo: en vez de int, hay que utilizar Integer.
Tipos de datos
Primitivos Objetos
int Integer
double Double
long Long
char Character
boolean Boolean
Dijimos que una colección es un grupo de objetos, pero obtener una colección vamos a
utilizar unas clases propias de Java. Estas clases, que van a ser el almacén de los objetos,
nos proveen con una serie de métodos comunes, para trabajar con los elementos de la
colección, como, por ejemplo: agregar y eliminar elementos u obtener el tamaño de la
colección, etc.
Las colecciones son una especie de arreglos de tamaño dinámico. Estas son parte del Java
Collections Framework dentro del paquete java.util. El Collections Framework es una
arquitectura compuesta de interfaces y clases. Dentro de este framework están las
colecciones que vamos a trabajar, las listas, conjuntos y mapas. Nota: el concepto de
interfaces lo vamos a explicar más adelante.
¿QUÉ ES UN FRAMEWORK?
Un framework es un marco de trabajo el cual contiene un conjunto estandarizado de
conceptos, prácticas y criterios para hacer frente a un tipo de problemática particular y
resolver nuevos problemas de índole similar.
1
Las clases del Java Collections Framework son las siguientes:
LISTAS
Las listas modelan una colección de objetos ordenados por posición. La principal diferencia
entre las listas y los arreglos tradicionales, es que la lista crece de manera dinámica a
medida que se van agregando objetos. No necesitamos saber de antemano la cantidad de
elementos con la que vamos a trabajar. El framework trae varias implementaciones de
distintos tipos de listas tales como ArrayList, LinkedList.
CONJUNTOS
Los conjuntos o en ingles Set modelan una colección de objetos de una misma clase donde
cada elemento aparece solo una vez, no puede tener duplicados, a diferencia de una lista
donde los elementos podían repetirse. El framework trae varias implementaciones de
distintos tipos de conjuntos:
2
• HashSet, se implementa utilizando una tabla hash para darle un valor único a cada
elemento y de esa manera evitar los duplicados. Los métodos de agregar y eliminar
tienen una complejidad de tiempo constante por lo que tienen mejor rendimiento que el
Treeset.
• LinkedHashSet está entre HashSet y TreeSet. Se implementa como una tabla hash con
una lista vinculada que se ejecuta a través de ella, por lo que proporciona el orden de
inserción.
MAPAS
Los mapas modelan un objeto a través de una llave y un valor. Esto significa que cada valor
de nuestro mapa, va a tener una llave única para representar dicho valor. Las llaves de
nuestro mapa no pueden repetirse, pero los valores sí. Un ejemplo seria una persona que
tiene su DNI/RUT (llave única) y como valor puede ser su nombre completo, puede haber
dos personas con el mismo nombre, pero nunca con el mismo DNI/RUT.
Los mapas al tener dos datos, también vamos a tener que especificar el tipo de dato tanto
de la llave y de el valor, pueden ser de tipos de datos distintos. A la hora de crear un mapa
tenemos que pensar que el primer tipo dato será el de la llave y el segundo el valor.
Son una de las estructuras de datos importantes del Framework de Collections. Las
implementaciones de mapas son HashMap, TreeMap, LinkedHashMap y HashTable.
• HashMap es un mapa implementado a través de una tabla hash, las llaves se almacenan
utilizando un algoritmo de hash solo para las llaves y evitar que se repitan.
3
• TreeMap es un mapa que ordena los elementos de manera ascendente a través de las
llaves.
Listas:
Conjuntos:
Mapas:
Listas:
4
Índice:
Elemento:
Conjuntos:
Ya que los conjuntos no constan de índices, solo se puede borrar por elemento.
Mapas:
La parte más importante de los elementos de un mapa es la llave del elemento, que es la
que hace el elemento único, por eso en los mapas solo podemos remover un elemento por
su llave.
Para recorrer una colección, vamos a tener que utilizar el bucle forEach. El bucle comienza
con la palabra clave for al igual que un bucle for normal. Pero, en lugar de declarar e
inicializar una variable contador del bucle, declara una variable vacía, que es del mismo tipo
que la colección, seguido de dos puntos y seguido del nombre de la colección. La variable
recibe en cada iteración un elemento de la colección, de esa manera si nosotros mostramos
esa variable, podemos mostrar todos los elementos de nuestra colección.
5
Para recorrer mapas vamos a tener que usar el objeto Map.Entry en el for each. A través de
el entry vamos a traer los valores y las llaves, si no, podemos tener un for each para cada
parte de nuestro mapa sin utilizar el objeto Map.Entry.
For Each:
Listas:
Conjuntos:
Mapas:
Sin Map.Entry:
6
ITERATOR
El Iterator es una interfaz que pertenece al framework de colecciones. Este, nos permite
recorrer, acceder a la información y eliminar algún elemento de una colección. Gracias al
Iterator podemos eliminar un elemento, mientras recorremos la colección. Ya que, cuando
queremos eliminar algún elemento mientras recorremos una colección con el bucle
ForEach, nos va a tirar un error.
Como el Iterator es parte de el framework de colecciones, todas las colecciones vienen con
el método iterator(), este, devuelve las instrucciones para para iterar sobre esa colección.
Este método iterator(), devuelve la colección, lo recibe el objeto Iterator y usando el objeto
Iterator, podemos iterar sobre nuestra colección.
Para poder usar el Iterator es importante crear el objeto de tipo Iterator, con el mismo tipo
de dato que nuestra colección.
Ejemplo Listas:
7
Listas:
Conjuntos:
Para ordenar una colección, vamos a tener que utilizar la función Collections.sort(coleccion).
La función, que es parte de la clase Collections, recibe la colección y la ordena para después
poder mostrarla ordenada de manera ascendente.
Algunas colecciones, como los conjuntos o los mapas no pueden utilizar el sort(). Ya que por
ejemplo los HashSet, manejan valores Hash y el sort() no sabe ordenar por hash, si no por
elementos. Por otro lado, los mapas al tener dos datos, el sort() no sabe por cual de esos
datos ordenar.
Entonces, para ordenar los conjuntos, deberemos convertirlos a listas, para poder ordenar
esa lista por sus elementos. Y a la hora de ordenar un mapa como tenemos dos datos para
ordenar, vamos a convertir el HashMap a un TreeMap.
Listas:
8
Conjuntos:
Mapas:
La manera de agregar los objetos a la colección es muy parecida a lo que habíamos visto
previamente.
Las colecciones Tree, ya sean TreeSet o TreeMap, son las únicas que no vamos a poder
agregar como siempre. Ya que, los Tree, siendo colecciones que se ordenan a sí mismas,
debemos informarle al Tree como va a ordenarse. Ahora, pensemos que un objeto posee
más de un dato(atributos), entonces, el Tree, no sabe por qué atributo debe ordenarse.
Para solucionar esto, vamos a necesitar un Comparator, este, le dará la pauta de como
ordenarse y sobre que atributo. El Comparator está explicado más abajo en la guía y
muestra como agregárselo a los Tree.
Listas:
Conjuntos:
9
Mapas:
Ejemplo:
Cuando queremos mostrar el libro, que está siendo recorrido por el for each, nos mostraría
algo así: Libreria.Libro@14ae5a5
Para poder usar este método vamos a ir a nuestra clase, ahí hacemos click derecho, insert
code y le damos a toString(). Eso nos va a generar un método toString() con los atributos de
nuestro objeto y que retorna una cadena para mostrar el objeto.
Ejemplo:
@Override
public String toString() {
return "Libro{" + "titulo=" + titulo + '}';
}
Este método se va a llamar solo, sin necesidad que lo llamemos nosotros, siempre que
queramos mostrar nuestro objeto en un System.out.println. Y mostrará la línea que se ve en
el return.
10
Ejemplo:
COMPARATOR
A la hora de querer ordenar una colección de objetos en Java, no podemos utilizar la función
sort, ya que el sort se utiliza para ordenar colecciones con elementos uniformes. Pero los
objetos pueden tener dentro distintos tipos de datos (atributos). Entonces, nuestra función
sort no sabe porqué tipo de dato o atributo ordenar. Para esto, utilizamos la interfaz
Comparator con su función compare() en nuestra clase entidad.
Supongamos que tenemos una clase Perro, que tiene como atributos el nombre del perro y
la edad. Nosotros queremos ordenar los perros por edad, deberemos crear el método
compare de la clase Comparator en la clase Perro.
Ejemplo:
• El método crea un objeto estático de la interfaz Comparator. Este nos va a permitir utilizar
a través de un sobrescribir (Override) el método compare, el mismo nos deja comparar
dos objetos para poder ordenarlos. Este objeto se crea static para poder llamar al
método solo llamando a la clase, sin tener que crear otro objeto Comparator, en este
caso la clase Perro.
11
• El método recibe dos objetos de la clase Perro y retorna una comparación entre los dos
usando los get para traer el atributo que queríamos comparar y usa la función
compareTo, que devuelve 0 si la edad es la misma, 1 si la primera edad es mayor a la
segunda y -1 si la primera edad es menor a la segunda.
• Si quisiéramos cambiar el atributo que usa para ordenar, pondríamos otro atributo en el
get del return.
Listas:
Conjuntos:
Crear un TreeSet
En los TreeSet necesitamos crearlos con el comparator porque como el TreeSet se ordena
solo, necesitamos decirle al TreeSet, bajo que atributo se va a ordenar, por eso le pasamos
el comparator en el constructor.
Mapas:
COLECCIÓNES EN FUNCIONES
A la hora de querer pasar una colección a una función, deberemos recordar que Java es
fuertemente tipado, por lo que deberemos poner el tipo de dato de la colección y que tipo
de colección es cuando la pongamos como argumento.
12
Listas:
Conjuntos:
Mapas:
Listas:
Conjuntos:
13
Mapas:
14
CLASE COLLECTIONS
La clase Collections es parte del framework de colecciones y también es parte del paquete
java.util. Esta clase nos provee de métodos que reciben una colección y realizan alguna
operación o devuelven una colección, según el método. Vamos a mostrar algunos de los
métodos pero, hay muchos más.
Método Descripción.
reverse(List<T> lista) Este método invierte el orden de los elementos de una lista.
Listas y Conjuntos:
Método Descripción.
15
Este método guarda un elemento en la lista en un índice
set(int índice, elemento) especifico.
Mapas:
Método Descripción.
16
PREGUNTAS DE APRENDIZAJE
1) Cual de estos paquetes es el contenedor de las colecciones:
a) java.lang
b) java.util
c) java.net
d) java.awt
17
EJERCICIOS DE APRENDIZAJE
En este módulo vamos a continuar modelando los objetos con el lenguaje de programación
Java, pero ahora vamos a utilizar las colecciones para poder manejarlas de manera más
sencilla y ordenada.
VER VIDEOS:
A. Introducción
B. Listas 1
C. Listas 2
D. Listas 3
3. Crear una clase llamada Alumno que mantenga información sobre las notas de
distintos alumnos. La clase Alumno tendrá como atributos, su nombre y una lista
de tipo Integer con sus 3 notas.
En el main deberemos tener un bucle que crea un objeto Alumno. Se pide toda la
información al usuario y ese Alumno se guarda en una lista de tipo Alumno y se le
pregunta al usuario si quiere crear otro Alumno o no.
Método notaFinal(): El usuario ingresa el nombre del alumno que quiere calcular
su nota final y se lo busca en la lista de Alumnos. Si está en la lista, se llama al
método. Dentro del método se usará la lista notas para calcular el promedio final
de alumno. Siendo este promedio final, devuelto por el método y mostrado en el
main.
18
VER VIDEO: Comparator
5. Se requiere un programa que lea y guarde países, y para evitar que se ingresen
repetidos usaremos un conjunto. El programa pedirá un país en un bucle, se
guardará el país en el conjunto y después se le preguntará al usuario si quiere
guardar otro país o si quiere salir, si decide salir, se mostrará todos los países
guardados en el conjunto.
Después deberemos mostrar el conjunto ordenado alfabéticamente para esto
recordar como se ordena un conjunto.
Y por ultimo, al usuario se le pedirá un país y se recorrerá el conjunto con un
Iterator, se buscará el país en el conjunto y si está en el conjunto se eliminará el
país que ingresó el usuario y se mostrará el conjunto. Si el país no se encuentra
en el conjunto se le informará al usuario.
6. Se necesita una aplicación para una tienda en la cual queremos almacenar los
distintos productos que venderemos y el precio que tendrán. Además, se necesita
que la aplicación cuente con las funciones básicas.
Estas las realizaremos en el main. Como, introducir un elemento, modificar su
precio, eliminar un producto y mostrar los productos que tenemos con su precio
(Utilizar Hashmap). El HashMap tendrá de llave el nombre del producto y de valor
el precio. Realizar un menú para lograr todas las acciones previamente
mencionadas.
19
EJERCICIOS DE APRENDIZAJE EXTRA
Estos van a ser ejercicios para reforzar los conocimientos previamente vistos. Estos pueden
realizarse cuando hayas terminado la guía y tengas una buena base sobre lo que venimos
trabajando. Además, si ya terminaste la guía y te queda tiempo libre en las mesas, podes
continuar con estos ejercicios extra, recordando siempre que no es necesario que los
termines para continuar con el tema siguiente. Por ultimo, recordá que la prioridad es ayudar
a los compañeros de la mesa y que cuando tengas que ayudar, lo más valioso es que
puedas explicar el ejercicio con la intención de que tu compañero lo comprenda, y no sólo
mostrarlo. ¡Muchas gracias!
1. Diseñar un programa que lea una serie de valores numéricos enteros desde el teclado
y los guarde en un ArrayList de tipo Integer. La lectura de números termina cuando se
introduzca el valor -99. Este valor no se guarda en el ArrayList. A continuación, el
programa mostrará por pantalla el número de valores que se han leído, su suma y su
media (promedio).
2. Crear una clase llamada CantanteFamoso. Esta clase guardará cantantes famosos y
tendrá como atributos el nombre y discoConMasVentas.
Se debe, además, en el main, crear una lista de tipo CantanteFamoso y agregar 5
objetos de tipo CantanteFamoso a la lista. Luego, se debe mostrar los nombres de
cada cantante y su disco con más ventas por pantalla.
Una vez agregado los 5, en otro bucle, crear un menú que le de la opción al usuario de
agregar un cantante más, mostrar todos los cantantes, eliminar un cantante que el
usuario elija o de salir del programa. Al final se deberá mostrar la lista con todos los
cambios.
3. Implemente un programa para una Librería haciendo uso de un HashSet para evitar
datos repetidos. Para ello, se debe crear una clase llamada Libro que guarde la
información de cada uno de los libros de una Biblioteca. La clase Libro debe guardar
el título del libro, autor, número de ejemplares y número de ejemplares prestados.
También se creará en el main un HashSet de tipo Libro que guardará todos los libros
creados.
En el main tendremos un bucle que crea un objeto Libro pidiéndole al usuario todos
sus datos y los seteandolos en el Libro. Despues, ese Libro se guarda en el conjunto y
se le pregunta al usuario si quiere crear otro Libro o no.
20
• Método prestamo(): El usuario ingresa el titulo del libro que quiere prestar y se lo
busca en el conjunto. Si está en el conjunto, se llama con ese objeto Libro al
método. El método se incrementa de a uno, como un carrito de compras, el
atributo ejemplares prestados, del libro que ingresó el usuario. Esto sucederá
cada vez que se realice un préstamo del libro. No se podrán prestar libros de los
que no queden ejemplares disponibles para prestar. Devuelve true si se ha
podido realizar la operación y false en caso contrario.
• Método devolucion(): El usuario ingresa el titulo del libro que quiere devolver y se
lo busca en el conjunto. Si está en el conjunto, se llama con ese objeto al método.
El método decrementa de a uno, como un carrito de compras, el atributo
ejemplares prestados, del libro seleccionado por el usuario. Esto sucederá cada
vez que se produzca la devolución de un libro. No se podrán devolver libros
donde que no tengan ejemplares prestados. Devuelve true si se ha podido
realizar la operación y false en caso contrario.
• Método toString para mostrar los datos de los libros.
21