Laboratorio de Tecnología de Objetos Índice Colecciones Colecciones e iteradores a la POO lenguaje Java Estruct. Biblioteca Excepciones 9Colecciones Entrada y salida GUIs • El marco de colecciones del JDK presenta un conjunto de clases estándar útiles (en java.util) para el manejo de colecciones de datos. Introd. • Proporciona: ¾ Interfaces (para manipularlas de forma independiente de la implementación) . ¾ Clases con implementaciones. ¾ Clases con algoritmos (para realizar determinadas operaciones sobre El ¾Las interfaces básicas y sus implementaciones. ¾Conjuntos, listas y aplicaciones. ¾Ordenación de colecciones. ¾Conjuntos y aplicaciones ordenados. Departamento de Lenguajes y Ciencias de la Computación Laboratorio de Tecnología de Objetos colecciones, como ordenaciones, búsquedas, etc.). • Beneficios de usar el marco de colecciones: ¾ Reduce los esfuerzos de diseño y de programación. ¾ Incrementa la rapidez y la calidad del diseño. ¾ Ayuda a la interoperabilidad y al reemplazamiento de las implementaciones. 1 Departamento de Lenguajes y Ciencias de la Computación Colecciones en JDK1.5 Laboratorio de Tecnología de Objetos 3 Interfaz que define las operaciones que normalmente implementan las clases que representan colecciones de objetos. Extiende Collection para conjuntos con elementos únicos. «interface» «interface» Collection<T> Map<K,V> HashMap<K,V> «interface» «interface» «interface» Set<T> List<T> SortedMap<K,V> TreeMap<K,V> ArrayList<T> Vector<T> LinkedList<T> «interface» SortedSet<T> TreeSet<T> Departamento de Lenguajes y Ciencias de la Computación «interface» «interface» Collection<T> Map<K,V> «interface» «interface» Set<T> List<T> SortedMap<K,V> «interface» SortedSet<T> Extiende Collection para secuencias de elementos, a los que se puede acceder atendiendo a su posición dentro de ésta. Extiende Set para conjuntos que Departamentosus de Lenguajes y mantienen elementos ordenados. Ciencias de la Computación Extiende Map para aplicaciones que mantienen sus relaciones ordenadas por sus claves. Laboratorio de Tecnología de Objetos 4 Implementaciones Hashtable<K,V> HashSet<T> Interfaz que define las operaciones que normalmente implementan las clases que representan aplicaciones de claves a valores. «interface» Interfaces básicas y sus implementaciones Tabla hash 2 Interfaces básicas • El marco se ha extendido de manera que todas las clases e interfaces se han definido también de forma parametrizada. • Con objeto de mantener la compatibilidad hacia atrás, conviven ambos marcos. • Entre otras muchas ventajas, la utilización del marco parametrizado. reduce significativamente errores que de otra forma pueden producirse en tiempo de ejecución (ClassCastException). • A partir de JDK1.5, el uso de clases del marco no parametrizado con el parametrizado produce avisos (warning) en tiempo de compilación para avisar de tal circunstancia. • Siempre que sea posible, es conveniente utilizar el nuevo marco. Departamento de Lenguajes y Ciencias de la Computación Laboratorio de Tecnología de Objetos • No hay implementación directa de la interfaz Collection; ésta se utiliza sólo para mejorar la interoperación de las distintas colecciones. • Por convenio, las clases que implementan colecciones proporcionan constructores para crear nuevas colecciones con los elementos de otra colección . • Lo mismo sucede con las implementaciones de Map. • Colecciones y aplicaciones no son intercambiables. • Todas implementan Cloneable (y Serializable). Array redimensionable Lista enlazada Árbol balanceado Laboratorio de Tecnología de Objetos Departamento de Lenguajes y Ciencias de la Computación 5 Departamento de Lenguajes y Ciencias de la Computación Laboratorio de Tecnología de Objetos 6 1 Laboratorio de Tecnología de Objetos Convenios sobre excepciones Algoritmos sobre colecciones • Las clases e interfaces de colecciones aplican las siguientes normas: • La clase java.util.Collections proporciona: ¾ Los métodos opcionales no implementados lanzan la excepción UnsupportedOperationException. ¾ Los métodos y constructores con argumentos que deben ser incluidos en la correspondiente colección lanzan la excepción ClassCastException si dichos elementos no son del tipo apropiado. ¾ Los métodos y constructores con argumentos que deben ser incluidos en la correspondiente colección lanzan la excepción IllegalArgumentException si el valor del elemento no es apropiado para la colección. ¾ Los métodos que devuelven un elemento lanzarán la excepción NoSuchElementException si la colección está vacía. ¾ Los métodos y constructores que toman un parámetro de tipo referencia suelen lanzar una excepción NullPointerException si se les pasa una referencia null. Departamento de Lenguajes y Ciencias de la Computación Laboratorio de Tecnología de Objetos 7 List<? extends Comparable<? super T>> list, T key) static <T> void fill(List<? super T> list, T o) static void shuffle(List<?> list) static <T extends Comparable<? super T>> void sort(List<T> list) static void reverse(List<?> list) static <T> void copy(List<? super T> dest, List<? extends T> src) ... ¾ Métodos para la creación de instancias de colecciones (fábricas de instancias o factory methods). Departamento de Lenguajes y Ciencias de la Computación Laboratorio de Tecnología de Objetos 8 public interface Collection<T> extends Iterable<E> { // Operaciones básicas int size(); boolean isEmpty(); boolean contains(Object element); boolean add(T element); // Opcional boolean remove(Object element); // Opcional Iterator<T> iterator(); // Operaciones con grupos de elementos boolean containsAll(Collection<?> c); boolean addAll(Collection <? extends T> c);// Opcional boolean removeAll(Collection<?> c); // Opcional boolean retainAll(Collection<?> c); // Opcional void clear(); // Opcional // Operaciones con arrays Object[] toArray(); <S> S[] toArray(S[] a); } • Proporciona un protocolo mínimo para una colección. • Algunas de las operaciones son opcionales, es decir, una colección concreta pudiera no implementarla. • Si se invoca una operación no implementada se lanza la excepción UnsupportedOperationException. • Las implementaciones de colecciones del paquete java.util implementan todas las operaciones opcionales. Laboratorio de Tecnología de Objetos 9 La interfaz Iterable<T> public interface Iterator<T> { boolean hasNext(); T next(); void remove(); } Iterator<T> iterator() Departamento de Lenguajes y Ciencias de la Computación Laboratorio de Tecnología de Objetos 10 • Un iterador permite el acceso secuencial a los elementos de una colección. // Opcional • El método remove() permite quitar elementos de la colección. Ésta es la única forma en que se recomienda se eliminen elementos durante la iteración (ConcurrentModificationException). • Sólo puede haber un mensaje remove() por cada mensaje next(). Si no se cumple se lanza una excepción IllegalStateException. • Si no hay siguiente next() lanza una excepción NoSuchElementException. que produce un objeto iterador para la correspondiente estructura Laboratorio de Tecnología de Objetos Departamento de Lenguajes y Ciencias de la Computación La interfaz Iterator<T> • Permite el uso de la forma simplificada del ciclo for para recorrer los objetos de las clase que la implementan. • Su unico método es Departamento de Lenguajes y Ciencias de la Computación static <T> int binarySearch( La interfaz Collection<T> Collection Departamento de Lenguajes y Ciencias de la Computación ¾ Constantes EMPTY_SET, EMPTY_LIST, EMPTY_MAP ¾ Métodos estáticos que implementan algoritmos polimórficos para varias operaciones sobre colecciones: 11 Departamento de Lenguajes y Ciencias de la Computación Laboratorio de Tecnología de Objetos 12 2 Laboratorio de Tecnología de Objetos Ejemplo: uso de iteradores Nueva construcción for • Mostrar una colección en pantalla. • La sentencia for se ha extendido de manera que permite una nueva sintaxis. Ejemplo: static <T> void mostrar(Collection<T> c) { Iterator<T> iter = c.iterator(); System.out.print(“< “); while (iter.hasNext()) { System.out.print(iter.next() + “ “); } System.out.println(“>“); } void mostrar(List<T> lista) { Iterator<T> it = lista.iterator(); while (it.hasNext()) { System.out.println(it.next()); } } • Eliminar las cadenas largas de una colección de cadenas. • Puede escribirse alternativamente como static void filtro(Collection<String> c, int maxLong) { Iterator<String> iter = c. iterator(); while (iter.hasNext()) { if ((iter.next()).length() > maxLong) { iter.remove(); } } } Departamento de Lenguajes y Ciencias de la Computación Laboratorio de Tecnología de Objetos void mostrar(List<T> lista) { for(T t : lista) { System.out.println(t); } } 13 La interfaz Set<T> Departamento de Lenguajes y Ciencias de la Computación Laboratorio de Tecnología de Objetos 14 Implementaciones de Set<T> • La interfaz Set es igual a la interfaz Collection. • java.util proporciona una implementación de Set<T>: public interface Set<T> extends Collection<T> { } HashSet<T> con • No permite elementos duplicados (control con equals()). 9Los datos en una tabla hash. 9Búsqueda, inserción y eliminación en tiempo (casi) constante. 9Constructores: • Las operaciones se comportan según la lógica de conjuntos: a es this containsAll(Collection<?> b) b⊆a addAll(Collection<? extends T> b) a=a∪b removeAll(Collection<?> b) a=a–b retainAll(Collection<?> b) a=a∩b clear() a=∅ Departamento de Lenguajes y Ciencias de la Computación Laboratorio de Tecnología de Objetos Sin argumentos, con una colección como parámetro, y constructores en los que se puede indicar la capacidad y el factor de carga de la tabla. 15 Departamento de Lenguajes y Ciencias de la Computación Ejemplo: uso de Set<T> Laboratorio de Tecnología de Objetos 16 List import java.util.*; • Colección de elementos dispuestos en una secuencia. public class Duplicados { public static void main(String[] args) { Set<String> s = new HashSet<String>(); for (int i = 0; i < args.length; i++) { if (!s.add(args[i])) { System.out.println("duplicado: " + args[i]); } } System.out.println( s.size() + " palabras detectadas: " + s); } } > java Duplicados uno dos cuatro dos tres cuatro cinco duplicado: dos duplicado: cuatro 5 palabras detectadas: [tres, dos, uno, cinco, cuatro] Departamento de Lenguajes y ¾ Acceso por posición numérica (0 ... size() – 1). ¾ Un índice ilegal produce el lanzamiento de una excepción IndexOutOfBoundsException. ¾ Iteradores especializados (ListIterator). ¾ Realiza operaciones con rangos de índices. SALIDA: Ciencias de la Computación Laboratorio de Tecnología de Objetos Departamento de Lenguajes y Ciencias de la Computación 17 Departamento de Lenguajes y Ciencias de la Computación Laboratorio de Tecnología de Objetos 18 3 Laboratorio de Tecnología de Objetos La interfaz List<T> La interfaz ListIterator<T> public interface List<T> extends Collection<T> { public interface ListIterator<T> extends Iterator<T> { boolean hasNext(); T next(); // Acceso posicional T get(int index); T set(int index, T element); void add(int index, T element); T remove(int index); boolean addAll(int index, Collection<? extends T> c); // Opcional // Opcional // Opcional boolean hasPrevious(); T previous(); // Opcional // Búsqueda int nextIndex(); int previousIndex(); // Iteración void remove(); void set(T o); void add(T o); int indexOf(Object o); int lastIndexOf(Object o); ListIterator<T> listIterator(); ListIterator<T> listIterator(int index); } // Vista de subrango } List<T> subList(int from, int to); Departamento de Lenguajes y Ciencias de la Computación Laboratorio de Tecnología de Objetos ¾ Vector<T> ¾ LinkedList<T> 9 Lista (doblemente) enlazada. 9 Inserción rápida, acceso aleatorio ineficiente. • Constructores: ¾ Sin argumentos o con una colección como parámetro. ¾ ArrayList y Vector tienen un tercer constructor en el que se puede indicar la capacidad inicial. void addFirst(T o) Departamento de Lenguajes y Ciencias de la Computación void addLast(T o) T getFirst() T getLast() T removeFirst() T removeLast() Laboratorio de Tecnología de Objetos 21 public class Shuffle { public static void main(String args[]) { // creamos la lista original List<String> original = new ArrayList<String>(); for (int i = 0; i < args.length; i++) { original.add(args[i]); } // creamos la copia y la desordenamos List<String> duplicado = new ArrayList<String>(original); Collections.shuffle(duplicado, new Random()); // comparamos las dos copias con sendos iteradores ListIterator<String> iterOriginal = original.listIterator(); ListIterator<String> iterDuplicado = duplicado.listIterator(); int mismoSitio = 0; while (iterOriginal.hasNext()) { if (iterOriginal.next().equals(iterDuplicado.next())) { mismoSitio++; } } //mostramos el resultado en pantalla System.out.println( duplicado + ": " + mismoSitio + " en el mismo sitio."); } } SALIDA: > dejava Departamento Lenguajes yShuffle uno dos tres cuatro cinco Ciencias de la Computación dos, uno, tres, cuatro]: 1 en [cinco, el mismo sitio. Laboratorio de Tecnología de Objetos 22 La interfaz Map<K,V> Map public interface Map<K,V> { // Operaciones básicas • La interfaz Map define aplicaciones (mappings) de claves a valores. 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(); ¾ Las claves son únicas (se controla con equals()). ¾ Cada clave puede emparejarse, a lo sumo, con un valor. • Una aplicación no es una colección, Map no hereda de Collection • Una aplicación puede ser vista como una colección de varias formas: ¾ un conjunto de claves, ¾ un conjunto de valores, o ¾ un conjunto de pares <clave, valor>. // opcional // opcional // Operaciones con grupos de elementos void putAll(Map<? extends K,? extends V> t);// opcional void clear(); // opcional // Vistas como colecciones • Algunas de las operaciones son opcionales. public Set<K> keySet(); public Collection<V> values(); public Set<Map.Entry<K,V>> entrySet(); ¾ Si se invoca una operación no implementada se lanza la excepción UnsupportedOperationException. ¾ Las implementaciones del paquete java.util implementan todas las operaciones. // Interfaz para los pares de la aplicación • Dos implementaciones: HashMap y HashTable (thread-safe). Con constructores estándares, con una aplicación, y otros en los que se puede especificar capacidad y factor de carga. Departamento de Lenguajes y Ciencias de la Computación 20 Ejemplo: uso de List Array redimensionable dinámicamente. Inserción y eliminación (al principio) ineficientes. Creación y consulta rápidas. Array redimensionable dinámicamente. Operaciones concurrentes no comprometen su integridad (thread-safe). • Métodos especiales de LinkedList: Laboratorio de Tecnología de Objetos import java.util.*; • java.util proporciona tres implementaciones: 9 9 9 9 9 Departamento de Lenguajes y Ciencias de la Computación 19 Implementaciones de List<T> ¾ ArrayList<T> // Opcional // Opcional // Opcional Laboratorio de Tecnología de Objetos Departamento de Lenguajes y Ciencias de la Computación } 23 public interface Entry<K,V> { K getKey(); V getValue(); V setValue(V value); } Departamento de Lenguajes y Ciencias de la Computación Laboratorio de Tecnología de Objetos 24 4 Laboratorio de Tecnología de Objetos Ejemplo: Map Conjuntos y aplicaciones ordenadas import java.util.*; public class Frecuencias { public static void main(String[] args) { Map<Integer,Integer> frecs = new HashMap<Integer,Integer>(); for (String s : args) { Integer valor = new Integer(s); // leer entero Integer frec = (Integer) frecs.get(valor); // frec. anterior if (frec == null) { // si no ha aparecido frecs.put(valor, 1); // iniciar frecuencia } else { // de lo contrario frecs.put(valor, ++frec); // incrementar frecuencia } } // Mostrar frecuencias iterando sobre el conjunto de claves for (Integer valor : frecs.keySet()) { int frec = frecs.get(valor); char[] barra = new char[frec]; // iniciar barra de frecuencias Arrays.fill(barra, '*'); // llenar con asteriscos System.out.println(valor + ":\t" + new String(barra)); } } } 5: ** 4: *** 3: **** 2: *** 32: * de Objetos Laboratorio de Tecnología • Los conjuntos y las aplicaciones tienen interfaces especiales para las implementaciones que tienen sus elementos (claves) ordenados: SortedSet y SortedMap. • Para ordenar los objetos de una colección o las claves de una aplicación se puede recurrir a: ¾ Su orden natural, cuando la clase de los objetos implementa la interfaz Comparable y, por tanto, define el método compareTo(). ¾ Un orden distinto impuesto por un objeto comparador particular que implemente la interfaz Comparator y, por tanto, disponga del método compare() para comparar los objetos de la colección o las claves. • Por defecto se aplica el orden natural en las colecciones y en las aplicaciones ordenadas. • Cuando no se quiera aplicar el orden natural, se puede pasar un comparador al constructor de una colección ordenada y al de una aplicación ordenada. java Frecuencias 5 4 32 3 4 3 2 3 4 2 5 2 3 Departamento de Lenguajes y Ciencias de la Computación 25 public interface Comparable<T> public int compareTo(T o); } negativo • Orden natural para una clase. cero positivo • Los objetos que se puedan ordenar de alguna de las formas anteriores pueden ser utilizados: ¾ como elementos de un conjunto ordenado (SortedSet) ¾ como claves en una aplicación ordenada (SortedMap), o ¾ en listas ordenables con alguno de los métodos: 26 { si receptor menor que o si receptor igual que o si receptor mayor que o • compareTo() no debe entrar en contradicción con equals(). • Muchas de las clases estándares en la API de Java implementan esta interfaz: Clase Orden natural Collections.sort(List<T> list). Collections.sort(List<T> list, Comparator<? super T> c). • Cuando se intenta comparar dos objetos no comparables se lanza una excepción ClassCastException. Laboratorio de Tecnología de Objetos Laboratorio de Tecnología de Objetos La interfaz Comparable<T> Conjuntos y aplicaciones ordenadas Departamento de Lenguajes y Ciencias de la Computación Departamento de Lenguajes y Ciencias de la Computación 27 La interfaz Comparator<T> Byte, Long, Integer, Short, Double y Float Character String Date Departamento de Lenguajes y ... Ciencias de la Computación numérico numérico (sin signo) lexicográfico cronológico Laboratorio de Tecnología de Objetos 28 Ejemplo: implementando Comparable import java.util.*; • Para las clases T que necesiten una relación de orden distinta del orden natural se recurre a comparadores u objetos de otra clase que implementa la interfaz Comparator<T>. public interface Comparator<T> { int compare(T o1, T o2); } negativo si o1 menor que o2 cero si o1 igual que o2 positivo si o1 mayor que o2 public class Persona implements Comparable<Persona> { private String nombre; private int edad; public Persona(String nombre, int edad) { this.nombre = nombre; this.edad = edad; } public int compareTo(Persona o) { int resultado = 0; if (edad > o.edad) { resultado = 1; return (new Integer(edad)).compareTo(o.edad); } else if (edad < o.edad) { resultado = -1; } return resultado; } } • compare() no debe entrar en contradicción con equals(). Departamento de Lenguajes y Ciencias de la Computación Laboratorio de Tecnología de Objetos Departamento de Lenguajes y Ciencias de la Computación 29 Departamento de Lenguajes y Ciencias de la Computación Laboratorio de Tecnología de Objetos 30 5 Laboratorio de Tecnología de Objetos La interfaz SortedSet<T> SortedSet • Extiende Set para proporcionar la funcionalidad propia de los conjuntos con elementos ordenados. • El orden utilizado es: public interface SortedSet<T> extends Set<T> { // Vistas de rangos SortedSet<T> headSet(T toElement); SortedSet<T> tailSet(T fromElement); SortedSet<T> subSet(T fromElement, T toElement); ¾ el orden natural, o ¾ el especificado con un Comparator en el momento de la creación. • java.util proporciona una implementación de SortedSet: // elementos mínimo y máximo T first(); T last(); ¾ TreeSet 9 Utiliza árboles binarios equilibrados. 9 Búsqueda y modificación más lenta que en HashSet. // acceso al comparador Comparator<? super T> comparator(); 9 Constructores: TreeSet() TreeSet(Comparator<? super T> c) TreeSet(Collection<? extends T> c) TreeSet(SortedSet<T> s) Departamento de Lenguajes y Ciencias de la Computación } Laboratorio de Tecnología de Objetos Devuelve el Comparator asociado con el conjunto ordenado, o null si éste usa el orden natural. Departamento de Lenguajes y Ciencias de la Computación 31 Ejemplo: definición de un comparador Laboratorio de Tecnología de Objetos 32 Ejemplo: uso de comparadores class ComparadorDeCadenasInv implements Comparator<String> { public int compare(String str1, String str2) { StringBuilder rts1 = (new StringBuilder(str1)).reverse(); StringBuilder rts2 = (new StringBuilder(str2)).reverse(); return (rts1.toString()).compareTo(rts2.toString()); } import java.util.*; public class UsoDeComparator { public static void main(String [] args) { // seleccionar comparador TreeSet<String>(); // orden natural Set strSet = new TreeSet<String> (String.CASE_INSENSITIVE_ORDER); (new ComparadorDeCadenasInv()); for (String s : args) { strSet.add(s); } System.out.println(strSet); } > java UsoDeComparador Manolo andres Paco blas [Manolo, [andres, [Paco, Manolo, Paco, blas, blas, andres, Manolo, andres] blas] Paco] } Departamento de Lenguajes y Ciencias de la Computación Laboratorio de Tecnología de Objetos 33 Departamento de Lenguajes y Ciencias de la Computación SortedMap public interface SortedMap<K,V> extends Map<K,V>{ // Vistas de rangos SortedMap<K,V> headMap(K toKey); SortedMap<K,V> tailMap(K fromKey); SortedMap<K,V> subMap(K fromKey, K toKey); ¾ el orden natural, o ¾ el especificado con un Comparator en el momento de la creación. • java.util proporciona una implementación de SortedMap: ¾ TreeMap // claves mínima y máxima K firstKey(); K lastKey(); 9 Utiliza árboles binarios equilibrados. 9 Búsqueda y modificación más lenta que en HashMap. 9 Constructores: // acceso al comparador Comparator<? super K> comparator(); TreeMap() TreeMap(Comparator<? super K> c) TreeMap(Map<? extends K,? super V> c) TreeMap(SortedMap<K,? extends V> s) Departamento de Lenguajes y Ciencias de la Computación Laboratorio de Tecnología de Objetos Departamento de Lenguajes y Ciencias de la Computación 34 La interfaz SortedMap<K,V> • Extiende Map para proporcionar la funcionalidad para aplicaciones con claves ordenadas. • El orden utilizado es: Laboratorio de Tecnología de Objetos } 35 Departamento de Lenguajes y Ciencias de la Computación Laboratorio de Tecnología de Objetos 36 6 Laboratorio de Tecnología de Objetos import java.util.*; Ejemplo: SortedMap for para clases contenedoras propias public class Frecuencias2 { public static void main(String[] args) { SortedMap<Integer,Integer> frecs = new TreeMap<Integer,Integer>(); for (String s : args) { • La sentencia for en su forma simplificada la puede utilizar una clase contenedora definida por el usuario. • Para esto, la clase en cuestión: // Poner a 1 la frecunencia de cada cadena o incrementarla } Integer valor = new Integer(s); Integer frec = frecs.get(valor); if (frec == null) { frecs.put(valor, 1); } else { frecs.put(valor, ++frec); } ¾ Debe implementar la interfaz Iterable<T>. 9 Esto le obliga a implementar el método: // Mostrar frecs. de subrango iterando sobre conj. ordenado de entradas SortedMap<Integer,Integer> subFrecs = frecs.subMap(1, 10); for (Map.Entry<Integer,Integer> entrada : subFrecs.entrySet()) { Integer valor = entrada.getKey(); int frec = entrada.getValue(); char[] barra = new char[frec]; Arrays.fill(barra, '*'); System.out.println(valor + ":\t" + new String(barra)); } } } java Frecuencias2 5 4 32 3 4 3 2 3 4 2 5 2 3 Departamento de Lenguajes y Ciencias de la Computación 2: 3: 4: 5: Iterator<T> iterator() ¾ Debe proporcionar una clase que implemente la interfaz Iterator<T>. Un objeto de esta clase: 9 Será el que realice la iteración. 9 Será devuelto por el método iterator() *** **** *** ** Laboratorio de Tecnología de Objetos • Veamos un ejemplo con el paquete pilas. Departamento de Lenguajes y Ciencias de la Computación 37 Ejemplo: for para pilas I ... // ¡Ojo!. Toma el mismo parámetro T de PilaEstatica! protected class IterPilaEstatica implements Iterator<T> { int posición; Pila<T> public interface Pila<T> extends Iterable<T>{ void añadir(T elem); T cima() throws PilaException; void eliminar() throws PilaException; boolean esVacía(); } protected IterPilaEstatica() { //inicializamos el iterador en la cima de la pila posición = siguienteLibre - 1; } package pilas; PilaEstatica<T> 38 Ejemplo: for para pilas II package pilas; public boolean hasNext() { return posición >= 0; } public class PilaEstatica<T> implements Pila<T> { protected int siguienteLibre; protected List<T> elementos; ... public T next() { if (posición < 0){ throw new NoSuchElementException("Pila vacía"); } return elementos.get(posición--); } // Implementación del método Iterator<T> iterator() Iterator<T> iterator() { return new IterPilaEstatica(); } public void remove() { throw new UnsupportedOperationException(); } // Debemos definir una clase anidada IterPilaEstatica // que implemente la interfaz Iterator<T> ... Departamento de Lenguajes y Ciencias de la Computación Laboratorio de Tecnología de Objetos Laboratorio de Tecnología de Objetos } } 39 Departamento de Lenguajes y Ciencias de la Computación Laboratorio de Tecnología de Objetos 40 Ejemplo: uso de for con pilas import pilas.*; import java.util.*; public class TestPilas { public static void main(String args []) { Pila<Integer> p = new PilaEstatica<Integer>(10); Random gna = new Random(); for (int i = 0; i < 5; i++) { p.añadir(gna.nextInt(100)); } System.out.println ("Muestra del contenido de la pila con un iterador"); Iterator<Integer> ip = p.iterator(); while (ip.hasNext()) { System.out.println (ip.next()); } System.out.println ("Muestra del contenido de la pila con un for"); for (Integer n : p) { System.out.println (n); } } } Departamento de Lenguajes y Ciencias de la Computación Laboratorio de Tecnología de Objetos Departamento de Lenguajes y Ciencias de la Computación 41 7