unidad didáctica 6 - us

36
Tipos List y Set con tipos genéricos Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos Versión 1.0.1 Unidad Didáctica 6

Upload: others

Post on 23-Jul-2022

1 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Unidad Didáctica 6 - us

Tipos List y Set con tipos

genéricos

Fundamentos de Programación

Departamento de Lenguajes y Sistemas Informáticos

Versión 1.0.1

Unidad Didáctica 6

Page 2: Unidad Didáctica 6 - us

UD 6: Tipos List y Set con tipos genéricos

Índice

Estructuras de datos predefinidas en Java (Colecciones)

Interfaz Collection

Métodos

Concepto de Lista

Métodos

Implementaciones

Concepto de Conjunto

Métodos

Implementaciones

Clase Collections

Page 3: Unidad Didáctica 6 - us

UD 6: Tipos List y Set con tipos genéricos

Índice

Estructuras de datos predefinidas en Java (Colecciones)

Interfaz Collection

Métodos

Concepto de Lista

Métodos

Implementaciones

Concepto de Conjunto

Métodos

Implementaciones

Clase Collections

Page 4: Unidad Didáctica 6 - us

UD 6: Tipos List y Set con tipos genéricos

Estructuras de datos predefinidas en Java

(Colecciones)

Java suministra una serie de Estructuras de Datos que

permiten modelar fácilmente problemas del mundo real

que involucran colecciones de datos.

Una Colección (Collection) es un tipo de datos que agrupa

a objetos de un mismo tipo.

Algunas colecciones admiten elementos duplicados, otras no.

Algunas mantienen los elementos ordenados según

determinados criterios, otras no.

Page 5: Unidad Didáctica 6 - us

UD 6: Tipos List y Set con tipos genéricos

Estructuras de datos predefinidas en Java

(Colecciones)

El uso de colecciones tiene numerosas ventajas:

Reduce el esfuerzo de programación puesto que proporciona

estructuras de datos y algoritmos útiles.

Incrementa la velocidad y la calidad de los programas, puesto

que Java ofrece implementaciones optimizadas y libres de

errores.

Simplifica la interoperabilidad y la reemplazabilidad entre

aplicaciones, puesto que facilita estructuras que se pueden

intercambiar entre distintos componentes.

Reduce esfuerzos de aprendizaje y diseño.

En Java las colecciones se representan mediante la

interfaz Collection del paquete java.util

Page 6: Unidad Didáctica 6 - us

UD 6: Tipos List y Set con tipos genéricos

Índice

Estructuras de datos predefinidas en Java (Colecciones)

Interfaz Collection

Métodos

Concepto de Lista

Métodos

Implementaciones

Concepto de Conjunto

Métodos

Implementaciones

Clase Collections

Page 7: Unidad Didáctica 6 - us

UD 6: Tipos List y Set con tipos genéricos

Interfaz Collection

Concepto:

Como se ha dicho, una Colección (Collection) es un tipo de datos

que agrupa a objetos de un mismo tipo.

Operaciones:

básicas:

¿colección vacía?, ¿contiene un elemento?, añadir, quitar, etc.

con grupos de elementos:

añadir un grupo, quitarlo, ¿los contiene?, borrar la colección, etc.

Page 8: Unidad Didáctica 6 - us

UD 6: Tipos List y Set con tipos genéricos

Interfaz Collection

La interfaz Collection en Java:

Pertenece al paquete java.util

Tiene un tipo genérico (le llamaremos <T>); es el tipo de

sus elementos.

Hereda de la interfaz Iterable<T>. Esta interfaz se verá

más adelante; permite iterar sobre los elementos de la

colección (recorrerlos sistemáticamente).

Los objetos “iterables” (los que heredan de Iterable)

permiten el uso de la sentencia for extendido, que se verá

en prácticas.

Page 9: Unidad Didáctica 6 - us

UD 6: Tipos List y Set con tipos genéricos

Interfaz Collection

No hay ninguna clase que implemente directamente la interfaz

Collection.

Cualquier clase que implemente una subinterfaz suya debe

tener al menos dos constructores:

Un constructor vacío, que crea una estructura vacía.

Un constructor con un argumento de tipo Collection, que crea un

objeto con los mismos elementos que la colección que recibe, con la

implementación correspondiente al constructor de la clase utilizada.

Este constructor se denomina “constructor copia”.

Java no permite obligar a que una clase tenga un determinado

constructor, pero todas las clases que implementan Collection

(sus subinterfaces), tienen los dos constructores anteriores.

Page 10: Unidad Didáctica 6 - us

UD 6: Tipos List y Set con tipos genéricos

Interfaz Collection

En esta lección vamos a ver en profundidad dos tipos de

colecciones, las listas (interfaz List) y los conjuntos

(interfaz Set).

<<interface>>

Set <T>

<<interface>>

List <T>

<<interface>>

Collection <T>

<<interface>>

Iterable <T>

etc.

etc.

Page 11: Unidad Didáctica 6 - us

UD 6: Tipos List y Set con tipos genéricos

Interfaz Collection. Métodos

package java.util;

public interface Collection<T> extends Iterable<T> {

// Operaciones básicas

int size();

boolean isEmpty();

boolean contains(Object o);

// Operaciones modificadoras

// Devuelven true si se modifica la colección

boolean add(T e);

boolean remove(Object o);

(sigue)

Page 12: Unidad Didáctica 6 - us

UD 6: Tipos List y Set con tipos genéricos

Interfaz Collection. Métodos(continuación)

// Operaciones con grupos de elementos

// Las operaciones booleanas devuelven true si se

// modifica la colección

boolean containsAll(Collection<?> c);

boolean addAll(Collection<? extends T> c);

boolean removeAll(Collection<?> c);

boolean retainAll(Collection<?> c);

void clear();

...

}

Nota: información detallada del contrato en http://java.sun.com/javase/6/docs/api/

- java.util – interfaz Collection

Page 13: Unidad Didáctica 6 - us

UD 6: Tipos List y Set con tipos genéricos

Índice

Estructuras de datos predefinidas en Java (Colecciones)

Interfaz Collection

Métodos

Concepto de Lista

Métodos

Implementaciones

Concepto de Conjunto

Métodos

Implementaciones

Clase Collections

Page 14: Unidad Didáctica 6 - us

UD 6: Tipos List y Set con tipos genéricos

Concepto de Lista

Una lista es una secuencia de elementos en la que el

orden en el que estén los elementos (cuál es el primero,

cuál el segundo, etc.) es relevante.

En una lista cada elemento está referenciado mediante un

índice.

El índice del primer elemento es el 0.

Una lista puede contener elementos duplicados.

En Java, la lista se modela mediante la interfaz List, que

hereda de Collection, por lo que tiene todos sus

métodos.

Añade algunos métodos: los que involucran a los índices.

Page 15: Unidad Didáctica 6 - us

UD 6: Tipos List y Set con tipos genéricos

Concepto de Lista. Métodos

public interface List<T> extends Collection<T> {

//Acceso posicional

T get(int index);

T set(int index, T element);

void add(int index, T element);

boolean remove(int index);

//Búsqueda

int indexOf(Object o);

int lastIndexOf(Object o);

//Vista de subrango

List<T> subList(int fromIndex, int toIndex);

...

}

Page 16: Unidad Didáctica 6 - us

UD 6: Tipos List y Set con tipos genéricos

Concepto de Lista. Métodos

List extiende a Collection, por lo que tiene todos sus

métodos.

La operación add(T e) añade el elemento al final de la

lista. Siempre devuelve true.

La operación remove(T e) elimina la primera aparición

del elemento e en la lista, si hay alguno; en ese caso

devuelve true.

Los métodos indexOf y lastIndexOf devuelven -1 si el

elemento no está en la lista.

Page 17: Unidad Didáctica 6 - us

UD 6: Tipos List y Set con tipos genéricos

Concepto de Lista. Métodos

Todos los métodos que contienen índices elevan la excepción IndexOutOfBoundsException si los índices se salen de los rangos adecuados. Esto funciona del mismo modo en el tipo Vector.

Para las operaciones

T get(int index);

T set(int index, T element);

boolean remove(int index);

el rango válido para el índice es

(0 <= index && index < size())

Para la operación

void add(int index, T element);

el rango válido para el índice es

(0 <= index && index <= size())

Page 18: Unidad Didáctica 6 - us

UD 6: Tipos List y Set con tipos genéricos

Concepto de Lista. Métodos

Para la operación

List<T> subList(int fromIndex, int toIndex);

los valores válidos para los índices son(0 <= fromIndex && fromIndex <= toIndex &&

toIndexindex <= size())

Devuelve una sublista con los elementos desde fromIndex(incluido) hasta toIndex (excluido). Si fromIndex == toIndex, devuelve la lista vacía. Si toIndex es size(), la sublista incluye al último elemento.

La lista devuelta está respaldada por la lista original (es una vista de ella): los cambios que se realizan en la sublistadevuelta se reflejan en la lista original. Si se realizan cambios estructurales (inserciones o borrados) en la lista original, se eleva una excepción.

Nota: información detallada del contrato enhttp://java.sun.com/javase/6/docs/api/ - java.util – interfaz List

Page 19: Unidad Didáctica 6 - us

UD 6: Tipos List y Set con tipos genéricos

Concepto de Lista. Ejemplos

Ejemplos

l =

l.size() == 5

l.contains( ) == true

l.contains( ) == false

Nota: si son objetos, los elementos 0, 1 y 4 serán referencias al mismo objeto.

Page 20: Unidad Didáctica 6 - us

UD 6: Tipos List y Set con tipos genéricos

Concepto de Lista. Ejemplos

l =

Operaciones que usan índice:

l.get(2) devuelve

l.indexOf( ) devuelve 3.

l.lastIndexOf( ) devuelve 4.

l.indexOf( ) devuelve -1.

Page 21: Unidad Didáctica 6 - us

UD 6: Tipos List y Set con tipos genéricos

Concepto de Lista. Ejemplos

l =

l.remove(3) modifica la lista, quedando:

y devolviendo

Page 22: Unidad Didáctica 6 - us

UD 6: Tipos List y Set con tipos genéricos

Concepto de Lista. Ejemplos

Sobre la lista anterior

l.add(2, )

modifica la lista, quedando:

0 1 2 3 4

Page 23: Unidad Didáctica 6 - us

UD 6: Tipos List y Set con tipos genéricos

Concepto de Lista. Ejemplos

Sobre la lista anterior

l.sublist(2, 4) devuelve la sublista

(llamémosla sl)

0 1 2 3 4

0 1

Page 24: Unidad Didáctica 6 - us

UD 6: Tipos List y Set con tipos genéricos

Concepto de Lista. Ejemplos

Si hacemos sl.add(1, ), es

sl =

y ahora l es

l =

0 1 2 3 4 5

0 1 2

Page 25: Unidad Didáctica 6 - us

UD 6: Tipos List y Set con tipos genéricos

Concepto de Lista. Implementaciones

Existen dos implementaciones de las listas:

ArrayList. La lista está almacenada en un array.

LinkedList. Cada elemento de la lista tiene una referencia a su anterior y a

su posterior.

Cada una tiene sus ventajas y sus inconvenientes.

Se verán con mucho más detalle en la asignatura EDDA

Page 26: Unidad Didáctica 6 - us

UD 6: Tipos List y Set con tipos genéricos

Concepto de Lista. Implementaciones

Para crear una lista vacía de un tipo T se usará

o bien

Por ejemplo, si tenemos un tipo Avion, para crear una lista de aviones se escribirá:

o

Más adelante se creará una factoría de colecciones que simplificará la creación de éstas.

List<T> nombreLista = new LinkedList<T>();List<T> nombreLista = new LinkedList<T>();

List<T> nombreLista = new ArrayList<T>();List<T> nombreLista = new ArrayList<T>();

List<Avion> listaAviones = new LinkedList<Avion>();List<Avion> listaAviones = new LinkedList<Avion>();

List<Avion> listaAviones = new ArrayList<Avion>();List<Avion> listaAviones = new ArrayList<Avion>();

Page 27: Unidad Didáctica 6 - us

UD 6: Tipos List y Set con tipos genéricos

Índice

Estructuras de datos predefinidas en Java (Colecciones)

Interfaz Collection

Métodos

Concepto de Lista

Métodos

Implementaciones

Concepto de Conjunto

Métodos

Implementaciones

Clase Collections

Page 28: Unidad Didáctica 6 - us

UD 6: Tipos List y Set con tipos genéricos

Concepto de Conjunto

Un conjunto es una colección en la que no se permiten elementos repetidos.

Se corresponde con el concepto matemático de conjunto.

En Java, se modela mediante la interfaz Set, que hereda de Collection, por lo que tiene todos sus métodos.

No añade ningún método:

Nota: información detallada del contrato enhttp://java.sun.com/javase/6/docs/api/ - java.util – interfaz Set

public interface Set<T> extends Collection<T> {

}

Page 29: Unidad Didáctica 6 - us

UD 6: Tipos List y Set con tipos genéricos

Concepto de Conjunto

Dados dos conjuntos (de Integer) a y b:

a = {1, 2, 3, 4}

b = {4, 5, 6}

recordemos que:

a = {1,2,3,4}

b= {4,5,6}

a b = {1,2,3,4,5,6}

a – b = {1,2,3}

a b = {4}

1

2

34

5

6

a b

Page 30: Unidad Didáctica 6 - us

UD 6: Tipos List y Set con tipos genéricos

Concepto de Conjunto. Métodos

La correspondencia entre las operaciones de los conjuntos en matemáticas y los métodos de la interfaz Set es: la unión: a.addAll(b) (devuelve boolean si cambia el

conjunto)

la diferencia: a.removeAll(b) (idem)

la intersección: a.retainAll(b) (idem)

ver si es vacío un conjunto: a.isEmpty( )

relación de inclusión: a.containsAll(b)

Los métodos addAll, removeAll, retainAll NO devuelven un nuevo conjunto (devuelven un booleano), sino que modifican el conjunto sobre el que se invocan.

Page 31: Unidad Didáctica 6 - us

UD 6: Tipos List y Set con tipos genéricos

Concepto de Conjunto. Implementaciones

Los conjuntos tienen fundamentalmente dos implementaciones, HashSet y TreeSet, aunque se usará principalmente la primera. Ambas se verán con detalle en la asignatura EDDA.

Para crear un conjunto vacío de tipo T se usará:

Por ejemplo, el siguiente código crea un conjunto de cadenas llamado diccionario:

Como se ha dicho, más adelante se creará una factoría de colecciones que simplificará la creación de éstas.

Set<T> nombreConjunto = new HashSet<T>();Set<T> nombreConjunto = new HashSet<T>();

Set<String> diccionario = new HashSet<String>();Set<String> diccionario = new HashSet<String>();

Page 32: Unidad Didáctica 6 - us

UD 6: Tipos List y Set con tipos genéricos

Índice

Estructuras de datos predefinidas en Java (Colecciones)

Interfaz Collection

Métodos

Concepto de Lista

Métodos

Implementaciones

Concepto de Conjunto

Métodos

Implementaciones

Clase Collections

Page 33: Unidad Didáctica 6 - us

UD 6: Tipos List y Set con tipos genéricos

Clase Collections

El paquete java.util contiene la clase Collections. Esta

clase está formada exclusivamente por métodos

estáticos que permiten operaciones sofisticadas sobre

las colecciones, como invertir una lista, barajarla,

ordenarla, buscar una sublista dentro de una lista,

encontrar el máximo o el mínimo de los elementos de

una colección, contar las veces en las que aparece un

elemento, etc.

Nota: información detallada en

http://java.sun.com/javase/6/docs/api/ - java.util – clase Collections

Page 34: Unidad Didáctica 6 - us

UD 6: Tipos List y Set con tipos genéricos

Clase Collections

Ejemplos:

Supongamos que tenemos una lista l de String que contiene

las cadenas "R", "T", "B", "A", "M“ en ese orden.

Si ejecutamos:

la salida es:

mostrar(l);mostrar(l);

[R, T, B, A, M][R, T, B, A, M]

Page 35: Unidad Didáctica 6 - us

UD 6: Tipos List y Set con tipos genéricos

Clase Collections

Ejemplos:

Si sobre el valor actual de l ([R, T, B, A, M]) hacemos:

se muestra por pantalla:

Collections.reverse(l);

mostrar

Collections.reverse(l);

mostrar(l);

[M, A, B, T, R][M, A, B, T, R]

Page 36: Unidad Didáctica 6 - us

UD 6: Tipos List y Set con tipos genéricos

Clase Collections

Ejemplos:

Sobre el valor actual de l ([M, A, B, T, R]) ejecutamos:

la salida será:

Finalmente, si hacemos:

se mostrará:

Collections.sort(l);

mostrar

Collections.sort(l);

mostrar(l);

[A, B, M, R, T][A, B, M, R, T]

Collections.fill(l, "X");

mostrar

Collections.fill(l, "X");

mostrar(l);

[X, X, X, X, X][X, X, X, X, X]