Colecciones e iteradores Colecciones Colecciones en JDK1.5

Anuncio
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
Descargar