NIVEL 14: ESTRUCTURAS DE ACCESO DIRECTO Genericidad, Java Collections, Cupi2Collections ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 2 Agenda • La tabla de hashing de Java: Hashtable • Genericidad vs. polimorfismo • Java Collections Framework • Cupi2 Collections Framework ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 3 Java Hashtable • Asociación llave – valor. • Ni la llave ni el valor pueden ser tipos simples de datos. • Los métodos • • • put (Object key, Object value) get (Object key) remove (Object key) ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 4 Java Hashtable: Ejemplo de Uso Hashtable estudiantes = new Hashtable ( ); estudiantes.put( “200327337", new Estudiante (“Maria") ); estudiantes.put( “20042790", new Estudiante (“Juan") ); Estudiante e1=(Estudiante)estudiantes.get( “200327337” ); estudiantes.remove( “220042790” ); ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 5 Agenda • La tabla de hashing de Java: Hashtable • Genericidad vs. polimorfismo • Java Collections Framework • Cupi2 Collections Framework ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 6 Polimorfismo: Poli (muchas) - morfo (forma) • Estructura polimorfa : puede contener objetos de distintas clases. • ArrayList lo hemos utilizado como una estructura polimorfa. ArrayList lista = new ArrayList( ); lista.add( new Integer( 1 ) ); lista.add( new Estudiante( “Juan” ); Integer num = ( Integer )lista.get( 0 ); Estudiante e1 = ( Estudiante )lista.get( 1 ); ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 7 Polimorfismo y estructuras polimorfas • En una estructura polimorfa guardamos objetos de cualquier clase, pero al recuperarlos debemos informar la clase a la que pertenecen (casting). • Es un mecanismo poderoso de reutilización • Tienen el problema de que no podemos garantizar que solo haya objetos de una clase • Hace el programa un poco más difícil de leer. ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 8 Genericidad • Permite definir estructuras con elementos de un solo tipo. • El compilador verifica que no haya inconsistencias. • Es un error tratar de agregar un objeto de otra clase. ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 9 Genericidad • Desde Java 5 existe una implementación genérica de Arraylist: ArrayList<Integer> lista = new ArrayList<Integer>( ); lista.add( new Integer( 1 ) ); Integer num =lista.get( 0 ); ERROR DE COMPILACIÓN lista.add( new Estudiante( “Juan” ); Estudiante e1 = ( Estudiante )lista.get( 1 ); ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 10 Genericidad • Para poder usar estructuras genéricas se debe compilar con Java 5 o superior. • Las estructuras genéricas pueden utilizar una sintaxis más compacta para hacer recorridos: ArrayList<Integer> lista = new ArrayList<Integer>( ); for( Integer elem : lista ) { System.out.println( elem ); } ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 11 Genericidad • Para usar una clase genérica basta con definir el (o los) tipos de datos que va a contener. Hashtable<String,Estudiante> estudiantes; estudiantes = new Hashtable<String, Estudiante>( ); estudiantes.put( “200398892”, new Estudiante( “Luis” ) ); • Para usar los elementos que contiene no hay necesidad de hacer ninguna conversión. Estudiante e1 = h1.get( “200398892” ); ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 12 Genericidad • Es posible definir una interfaz genérica: Variable para indicar el tipo public interface Iterador<T> { public boolean haySiguiente( ); public T darSiguiente( ); public void reiniciar( ); } ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 13 Genericidad • Convenciones para los nombres de los parámetros • E - Element (used extensively by the Java Collections Framework) • K - Key • N - Number • T - Type • V – Value ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 14 Genericidad • Para definir una clase genérica se deben definir parámetros para los tipos de datos que va a contener public class IteradorSimple<T> implements Iterador<T> { private T[] elems; private int posActual; private int sigPosLibre; } ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 15 public class Curso<T> implements Iterador<T> { private T[] elems; private int posActual; private int sigPosLibre; public boolean haySiguiente( ) { } public T darSiguiente( ) { } public void reiniciar( ) { } } ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 16 Genericidad • Los métodos utilizan los parámetros que definen los tipos como si fueran clases normales: public class Curso<T> implements Iterador<T> { private T[] elems; … } public T darSiguiente( ) { return elems[posActual + 1]; } ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 17 Genericidad • Una clase se puede parametrizar con un tipo que cumpla ciertos contratos: • Por ejemplo: • Se quiere tener un árbol binario ordenado y genérico donde los nodos se puedan comparar según el orden lógico del nodo. ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 18 Genericidad • Si el nodo • Orden aritmético • Si el nodo • del árbol es de tipo Integer del árbol es de tipo String Orden lexicográfico • Si el nodo del árbol es de tipo MiClase • Definir el orden natural ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 19 Genericidad • Los nodos deben implementar la interfaz Comparable de Java. public interface Comparable<T> { public int compareTo( T obj ); } ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 20 Genericidad • Una clase se puede parametrizar con un tipo que cumpla ciertos contratos: public class ArbolBinarioOrdenado<T extends Comparable<? super T>> { … public void insertar( T pElemento ) { T elem = … int resultado = elem.compareTo( pElemento ); } } ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 21 Agenda • La tabla de hashing de Java: Hashtable • Genericidad vs. polimorfismo • Java Collections Framework • Cupi2 Collections Framework ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 22 Java Collections Framework • Colección (contenedora) : Objeto que agrupa múltiples elementos • El framework define una arquitectura para representar y manipular las colecciones. ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 23 Java Collections Framework • Elementos del framework: Interfaces • Implementaciones – Clases • Algoritmos – métodos • ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 24 Dos tipos de interfaces Collection Set List SortedSet Jerarquía de interfaces ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co Map Queue SortedMap 25 Java Collections Framework • Interfaces genéricas (Generics): • Las colecciones pueden ser manipuladas independientemente de los detalles de su representación. public interface Collection<E> extends Iterable<E> { … } ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co Elemento de la colección 26 Java Collections Framework • Collection: Representa un grupo de objetos o elementos. • Es la interfaz más general • Algunos tipos permiten elementos duplicados otros no. • Algunos están ordenados otros no • No hay implementación directa de la interfaz, pero sí de sus subinterfaces (Set y List) ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 27 Collection List Set Queue SortedSet ArrayList LinkedList Interfaz Implementación ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co TreeSet LinkedHashSet HashSet 28 Java Collections Framework Ejemplos: • Una colección, puede ser un List, un Set, u otro tipo de Collection • Collection<String> c • Crear un ArrayList (una implementación de la interfaz List), que contiene todos los elementos en c. • List<String> list = new ArrayList<String>(c); ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 29 public interface Collection<E> extends Iterable<E> { // Basic operations int size(); boolean isEmpty(); boolean contains(Object element); boolean add(E element); //optional boolean remove(Object element); //optional Iterator<E> iterator(); // Bulk operations boolean containsAll(Collection<?> c); Acepta cualquier colección Acepta elementos de la colección o hijos de la misma boolean addAll(Collection<? extends E> c); //optional boolean removeAll(Collection<?> c); //optional boolean retainAll(Collection<?> c); //optional void clear(); //optional // Array operations Object[] toArray(); ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 30 Recorriendo colecciones • (1) for-each • Sintaxis Tipo del elemento referencia Referencia a la colección for (Object o : collection) System.out.println(o); Uso de la referencia Se puede leer como: “para cada objeto en la colección haga” ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 31 Recorriendo colecciones • (1) Ejemplo for-each public int sumar( Collection<Integer> enteros ) { int total = 0; for( Integer i : enteros ) { total += i; } return total; } ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 32 Java Collections Framework • (2) Interface Iterator public interface Iterator<E> { boolean hasNext(); //Retorna true si la iteración tiene más elementos E next(); //Retorna el elemento siguiente en la iteración void remove(); por next() } ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co //Elimina el último elemento retornado 33 Recorriendo colecciones • (2) Ejemplo Iterator public int sumar( Collection<Integer> enteros ) { int total = 0; Iterator<Integer> it = enteros.iterator(); while( it.hasNext() ) { Integer i = it.next(); total += i; } return total; } ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 34 Java Collections Framework • Set : Colección sin elementos repetidos. • Implementaciones: • • • HashSet: Almacena los elementos en una tabla de hash TreeSet: Almacena los elementos en un árbol rojonegro. Están ordenados por sus valores. LinkedHashSet: Almacena los elementos en una tabla de hash con una lista encadenada a través de ellos. Los elementos están ordenados en orden de inserción. ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 35 Java Collections Framework Ejemplos: • Se tiene una colección c, y se quiere crear una nueva que tenga los mismos elementos pero sin duplicados. Collection<Type> noDups = new HashSet<Type>(c); • Mantener el orden de la colección removiendo los duplicados Collection<Type> noDups = new LinkedHashSet<Type>(c); ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co original 36 Java Collections Framework • List: Colección ordenada • • o secuencia. Puede contener elementos repetidos Operaciones para: Acceso a los elementos según su posición en la lista. • Búsqueda de un objeto especifico y retornar la posición • Iterar utilizando la característica de secuencia de la lista • Manejar rangos dentro de la lista • ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 37 • Implementaciones: • ArrayList: Arreglo cuyo tamaño se puede redimensionar • • • Permite elementos nulos Provee métodos para manipular el tamaño del arreglo usado para almacenar la lista. LinkedList: Provee métodos para manejar la cabeza y la cola de la lista. • La lista encadenada puede ser usada como una pila o cola. ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 38 • Queue : Colección que maneja la prioridad para procesar los elementos La cabeza de la cola es el elemento que siempre va a ser removido. • Provee operaciones adicionales para insertar, extraer e inspeccionar los elementos. • Generalmente, los elementos están ordenados de tal manera que el primero en entrar es el primero en salir (FIFO). • La cola de prioridades ordena de acuerdo a un criterio o al orden natural de los elementos. • Las implementaciones deben especificar cómo están ordenados los elementos. • • SortedSet: Mantiene los elementos ordenados ascendentemente ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 39 Map SortedMap HashMap TreeMap Interfaz LinkedHashSet ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co Implementación 40 Java Collections Framework • Map: Objeto que mapea llaves y valores. • No contiene llaves repetidas • Proporciona tres vistas de la colección: • • • Colección de llaves (keySet) Colección de valores (values) Colección de parejas llave-valor (entrySet) ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 41 public interface Map<K,V> { // Basic operations V put(K key, V value); V get(Object key); V remove(Object key); boolean containsKey(Object key); boolean containsValue(Object value); int size(); boolean isEmpty(); // Bulk operations void putAll(Map<? extends K, ? extends V> m); void clear(); // Collection Views public Set<K> keySet(); public Collection<V> values(); public Set<Map.Entry<K,V>> entrySet(); // Interface for entrySet elements public interface Entry { K getKey(); V getValue(); V setValue(V value); } } ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 42 Java Collections Framework • Implementaciones: • • • HashMap TreeMap LinkedHashMap • Comportamiento y desempeño análogo a HashSet, TreeSet y LinkedHashSet ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 43 Java Collections Framework • Ejemplo: Se tiene un Map llamado m • Crear un HashMap que contenga las mismas parejas llave-valor que m Map<K, V> copy = new HashMap<K, V>(m); ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 44 Java Collections Framework • SortedMap: Mantiene los elementos ordenados ascendentemente de acuerdo a las llaves ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 45 Tarea • Consultar la documentación de las interfaces y clases de Collections Framework ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 46 Agenda • La tabla de hashing de Java: Hashtable • Genericidad vs. polimorfismo • Java Collections Framework • Cupi2 Collections Framework ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 47 CUPI2 Collections • Proyecto que consiste en el desarrollo de un conjunto de estructuras de datos y algoritmos en Java. ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 48 CUPI2 Collections • El objetivo de Cupi2 Collections es mostrar una forma sencilla de implementar diversas clases de estructuras así como la utilidad de las mismas. • Cada estructura • • • implementada tiene: implementación (archivos .java) documentación (javadoc) pruebas (JUnit) ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 49 Cupi2 Collections Framework • Estructuras genéricas: • • • • • Iteradores Estructuras lineales Estructuras de acceso directo Estructuras recursivas Estructuras no lineales ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 50 CUPI2 Collections Estructuras implementadas: • LINEALES • • • • • Listas: Lista, Lista Encadenada, Lista Encadenada Ordenada Colas: Cola Encadenada, Cola Prioridad Conjunto Iteradores: Iterador Simple, Iterador Flexible Secuencia: Algoritmos para búsqueda Binaria, búsqueda Secuencial, ordenamiento Burbuja, ordenamiento por Inserción, ordenamiento por Selección, Quick Sort, Shell Sort. Pila Encadenada • … • ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 51 CUPI2 Collections Estructuras implementadas: • • • ESTRUCTURAS RECURSIVAS BINARIAS • Árboles: Binario, Binario Ordenado, AVL, Rojo-Negro • … ESTRUCTURAS RECURSIVAS N-ARIAS • Arboles: 2_3, 2_4, n-ario, B, Heap • Trie • … ESTRUCTURAS NO LINEALES • Grafos dirigidos: algoritmo de Dijkstra ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 52 CUPI2 Collections Estructuras implementadas: • ESTRUCTURAS DE ACCESO DIRECTO • BitArray • BitString • Tabla de Hashing • Text: Algoritmo de Huffman ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co 53 Tarea • Recorrer el sitio WEB del proyecto y visitar la descripción de cada una de las estructuras de datos que allí se encuentran desarrolladas. ISIS1206 – Estructuras de Datos http://cupi2.uniandes.edu.co