Download Introducción al lenguaje de programación Java

Document related concepts
no text concepts found
Transcript
vi. Colecciones
- interfaz Collection
- clases ArrayList, LinkedList, HashSet, TreeSet
- interfaz Map
- clases TreeMap, HashMap
- Iteratores: interfaz Iterator
vii. Clases anidadas e internas
El lenguaje de programación Java
1
Colecciones en Java
• Permite almacenar y organizar objetos de manera útil para un
acceso eficiente.
• Se encuentran en el paquete java.util
• Núcleo de abstracciones de colecciones de utilidad (interfaces) e
implementaciones ampliamente útiles.
• Las interfaces proporcionan métodos para todas las operaciones
comunes y las implementaciones concretas especifican la decisión
de las operaciones no permitidas.
(java.lang.UnsupportedOperationException)
• Sobre los elementos se puede iterar (Iterator)
El lenguaje de programación Java
2
Jerarquía de colecciones
devuelve
Iterator
devuelve
Collection
Map
devuelve
ListIterator
List
Set
AbstractCollection
AbstractList
TreeMap
AbstractMap
HashMap
AbstractSet
HashSet
ArrayList
SortedSet
SortedMap
AbstractSequentialList
TreeSet
extends
implements
interface
class
LinkedList
3
Interfaz Collection (1/2)
- Collection
-
int size()
boolean empty()
boolean contains(Object elem)
Iterator iterator()
Object[] toArray(), Object[] toArray(Object dest[])
boolean add(Object elem),
boolean remove(Object elem)
void clear()
- List –
Una colección cuyos elementos permanecen en un orden particular a
menos que se modifique la lista (no significa lista enlazada aunque es una posible
implementación).
-
void add(int index, Object element)
Object remove(int index)
Object get(int index)
Object set(int index, Object element)
int indexOf(Object o)
int lastIndexOf(Object o)
List subList(int min, int max)
4
Interfaz Collection (2/2)
-Set – Una colección (conjunto) donde no puede haber
elementos repetidos, y cuyos elementos no se almacenan
necesariamente siguiendo un orden particular.
- Mismos métodos que Collection con otro contrato.
-SortedSet – Conjunto con elementos ordenados.
-Object first()
-Object last()
-SortedSet subSet(Object fromElement, Object toElement)
-SortedSet headSet(Object toElement)
-SortedSet tailSet(Object fromElement)
5
Interfaz Map
- Map
- Un objeto que asocia claves con valores.
- No puede tener claves duplicadas.
– Object put(Object key, Object value);
Object remove(Object key); Object get(Object key);
– containsKey, containsValue, isEmpty, size
- Proporciona tres vistas de colección: colección de claves (keySet),
colección de valores (values), colección de asociaciones clave-valor
(entrySet).
- SortedMap: Un mapa cuyas claves están ordenadas.
- Object firstKey(), Object lastKey(), SortedMap
subMap(Object minKey, Object maxKey), SortedMap
headMap(Object maxKey), SortedMap tailMap(Object
minKey)
El lenguaje de programación Java
6
Iteración
• Collection >> Iterator iterator();
interface Iterator{
boolean hasNext();
/* Devuelve true si la iteración tiene mas elementos */
Object next();
/* Devuelve el siguiente elemento de la iteración
Lanza excepción NoSuchElementException */
void remove();
/* Elimina el último elemento devuelto por la iteración
Está capacitado para decir que no lo implementa
UnsupportedOperationException */
}
• La interfaz ListIterator extiende a Iterator y maneja
un objeto List ordenado. Permite iterar hacia delante y hacia
El lenguaje de programación Java
7
atrás.
Ejemplo de uso de Iteradores
• Cálculo del gasto total de un departamento
public double gastoDpto(){
double gasto=0;
Iterator it=plantilla.iterator();
while (it.hasNext()){
gasto+=((Empleado)it.next()).getSueldo();
}
return gasto;
}
Siendo plantilla una colección que implemente la interfaz Collection
El lenguaje de programación Java
8
Implementaciones de Collection
-LinkedList – Una implementación de una lista doblemente enlazada.
La modificación es poco costosa para cualquier tamaño, pero el acceso
aleatorio es lento. Útil para implementar colas y pilas.
-getFirst, getLast, removeFirst, removeLast, addFirst, addLast
-ArrayList – Una lista implementada utilizando un array de dimensión
modificable. Es costoso añadir o borrar un elemento cerca del principio de
la lista si ésta es grande, pero es relativamente poco costoso de crear y
rápido para acceso aleatorio.
-HashSet – Un Set implementado mediante una tabla hash. Es una buena
implementación de propósito general por lo que la búsqueda, la adición y
eliminación son insensibles al tamaño de los contenidos.
-TreeSet – Un SortedSet implementado utilizando un árbol binario
equilibrado. Es más lento para buscar o modificar que un HashSet, pero
mantiene los elementos ordenados. Asume que los elementos son
comparables si no se le ha pasado un comparator en el constructor.
-Todas son Cloneable y Serializable
El lenguaje de programación Java
9
Convenciones sobre excepciones
• UnsupportedOperationException
– Métodos opcionales en la implementación de una interfaz
• ClassCastException
– El tipo del elemento que se desea insertar no es del tipo
apropiado
• IllegalArgumentException
– El valor del elemento no es apropiado para la colección
• NoSuchElementException
– La colección de la que se quiere devolver un elemento está vacía
• NullPointerException
– Se pasa como argumento una referencia con valor null cuando
la colección no admite este valor.
El lenguaje de programación Java
10
Declaración de colecciones
Clase concreta
import java.util.*;
public class ColeccionSimple {
public static void main( String args[] ) {
List c = new ArrayList();
for( int i=0; i < 10; i++ )
c.add(new Integer(i));
interfaz
Iterator it = c.iterator();
while( it.hasNext() )
System.out.println(it.next());
}
}
El lenguaje de programación Java
11
Implementaciones de Map
•HashMap
- Una implementación de Map con una tabla hash.
- El método hashCode de cada clave se utiliza para seleccionar un lugar en la
tabla
- Una colección de utilidad muy general con tiempos relativamente cortos de
búsqueda e inserción.
•TreeMap
– Una implementación de SortedMap utilizando un árbol binario equilibrado
que mantiene sus elementos ordenados por clave.
– Útil para conjuntos de datos ordenados que requieren una búsqueda por clave
moderadamente rápida.
-Asume que los elementos son comparables si no se le ha pasado un
comparator en el constructor.
El lenguaje de programación Java
12
Ejemplo
1/2
• Generar números al azar (Math.random) y contar cuantas veces
sale cada uno.
• HashMap = Colección de pares (clave-valor)
– Clave = número aleatorio generado
– Valor = contador que acumula las veces que ha aparecido
class Contador {
private int i;
public Contador(){ i=1;}
public void incrementar(){++i;}
public String toString() {
return Integer.toString(i);
}
}
El lenguaje de programación Java
13
Ejemplo
2/2
class Estadistico {
public static void main( String args[] ) {
HashMap tabla = new HashMap();
for(int i=0; i < 10000; i++) {
// Generar un número entre 0 y 20
Integer num = new Integer((int)(Math.random()*20));
if(tabla.containsKey(num))
//Incrementamos el contador asociado al número
((Contador)tabla.get(num)).incrementar();
else
//Añadimos nuevo par: numero-contador
tabla.put(num, new Contador());
}
System.out.println(tabla);
}
}
El lenguaje de programación Java
14
Las utilidades de Collections
• public static Object min(Collection col)
• public static Object max(Collection col)
• public static Object min(Collection col, Comparator
comp)
• public static Object max(Collection col, Comparator
comp)
• public static void reverse(List lista)
• public static void copy(List dst, List fnt)
• public static void sort(List lista)
• public static void sort(List lista, Comparator comp)
• public static int binarySearch(List lista, Object
clave)
• public static int binarySearch(List lista, Object
clave, Comparator comp)
El lenguaje de programación Java
15
Conclusiones
• Si un método tiene que devolver (pasar como parámetro)
una colección de objetos, el tipo será Iterator o
cualquiera de las interfaces de colección.
• El tipo de la declaración de los atributos y variables
locales será cualquiera de las interfaces de colección.
– List lista = new ArrayList();
– Excepción: LinkedList si la utilizamos como pila o cola.
• Utilizar SIEMPRE Iterator para el recorrido de
cualquier colección.
El lenguaje de programación Java
16
Clases anidadas e internas
• Un clase o interfaz se puede declarar dentro de otras clases
o interfaces.
• Un tipo anidado se considera parte del tipo que lo contiene.
• Cada uno puede acceder a los miembros del otro (incluso
los privados).
• Los tipos anidados pueden declararse:
– static (clases anidadas): permite una estructuración simple de tipos
– No estático (clases internas): define una relación especial entre el objeto
anidado y el objeto de la clase que lo contiene
• Se recomienda un único nivel de anidamiento
• Toda clase interna produce un archivo .class
ClaseExterna.class
ClaseExterna$ClaseInterna.class
El lenguaje de programación Java
17
Clases anidadas estáticas
• El modificador static precede al nombre de la clase.
• Igual que los miembros estáticos son independientes de los
objetos que se creen de la clase externa (no se puede
acceder a los campos no estáticos).
• Sirve como mecanismo para definir tipos lógicamente
relacionados.
• La clases anidada se comporta como cualquier otra clase:
– Se pueden definir subclases. La clase que extienda a la clase anidada no
hereda su privilegio de acceso a la clase que la contiene
– Implementar un interfaz
– Declararse como abstract o final
• Declaración de una variable:
ClaseExterna.ClaseAnidada var;
El lenguaje de programación Java
18
Ejemplo:
Definir estructura de datos asociadas
class Pila {
private Nodo cabeza;
private static class Nodo {
Object valor;
Nodo siguiente;
Nodo(Object v, Nodo s){
valor = v;
siguiente = s;
}
}
public void push (Object obj){
cabeza = new Nodo (obj,cabeza);
}
public Object pop (){
Object primero = cabeza.valor;
cabeza = cabeza.siguiente;
return primero;
}
El lenguaje de programación Java
}
19
Clases internas
• Clases anidadas no estáticas.
• Un objeto de la clase interna se asocia siempre con un objeto de la
clase que la incluye, de manera que ve los atributos y métodos de la
clase externa como propios.
• Los objetos de la clase interna se crean dentro de los métodos de
instancia de la clase que las incluye.
• El objeto receptor del método de instancia se asocia por defecto con el
objeto interno.
• La declaración es igual a la de cualquier otra clase con la restricción de
que no pueden tener miembros estáticos (excepto si son finales).
• Puede ocultar atributos y métodos de la clase envolvente.
El lenguaje de programación Java
20
Ejemplo:
Creación del objeto de la clase interna dentro
de un método de instancia de la clase envolvente
class CuentaBancaria{
private long numero;
private long saldo;
private Operacion ultimaOp;
}
private class Operacion{
String descripcion;
long cantidad;
...
public String toString(){
return numero + “: ”+ descripcion+” “+cantidad;
}
}
...
public void reintegro(long cantidad){
saldo -=cantidad;
ultimaOp= new Operacion(“reintegro”, cantidad);
}
El lenguaje de programación Java
21
Ejemplo:
acceso a métodos ocultos
class Externa{
void imprimir(){}
class Interna{
void imprimir(){} //oculta los métodos del mismo
//nombre en la clase externa
void mostrar(){
imprimir();
Externa.this.imprimir();
//OK.Invocación explícita al método de la clase Externa
El lenguaje de programación Java
22
Ejemplo:Acceso a todos lo miembros de quien lo contiene
interface Iterator{
boolean hasNext();
Object next();
void remove();
}
public class Secuencia{
private Objects[] contenido;
private int siguiente = 0;
public Secuencia(int tamaño){
contenido = new Object[tamaño];
}
public void añadir(Object obj){
if (siguiente<contenido.length){
contenido[siguiente]=obj;
siguiente++;
}
El lenguaje de programación Java
}
23
Ejemplo (continuación)
//Clase interna accede al atributo contenido de la clase Secuencia
private class CIterator implements Iterator{
private int pos=0;
public boolean hasNext(){
return (pos < contenido.length);
}
public Object next(){
if (pos >= contenido.length)
throw new NoSuchElementException();
return contenido[pos++];
}
public void remove(){
throw new UnsupportedOperationException();
}
}//Fin de la clase Interna
public Iterador iterador(){
return new CIterador();
}
} //Fin de la clase Secuencia
El lenguaje de programación Java
24
Uso del iterador de la clase Secuencia
Secuencia s = new Secuencia(10);
...
Iterator iter = s.iterator();
while (iter.hasNext()){
System.out.println(iter.next());
}
El lenguaje de programación Java
25
Clases internas locales
• Pueden definirse en cualquier punto del código (ej. dentro
de un método).
• Inaccesibles desde el exterior del bloque de código donde
se definen.
• Pueden acceder a todas las variables que estén dentro
del alcance de donde se define (ej. variables y/o
parámetros de un método) si se declaran como final.
El lenguaje de programación Java
26
Ejemplo: Iterador creado dentro de un método
public Iterator iterator(){
class CIterador implements Iterator{
private int pos=0;
public boolean hasNext(){
return (pos < contenido.length);
}
public Object next(){
if (pos>= contenido.length)
throw new NoSuchElementException();
return contenido[pos++];
}
public void remove(){
throw new UnsupportedOperationException();
}
}
return new CIterador();
}
El lenguaje de programación Java
27
Clases internas anónimas
• Se definen en el mismo momento en el que se instancian
con new.
• No puede tener una cláusula explícita extends o
implements.
• No puede tener constructores explícitos declarados.
• Permanece la necesidad de invocar a un constructor de la
superclase.
• Ejemplo: subclase anónima que invoca al constructor y
redefine un método
SuperClase var = new SuperClase (valor){
public void met(Object obj){
//redefinicion de met
}
};
El lenguaje de programación Java
28
Ejemplo:
Iterador anónimo
public Iterator iterator(){
return new Iterator(){
private int pos=0;
public boolean hasNext(){
return (pos < contenido.length);
}
public Object next(){
if (pos>= contenido.length)
throw new NoSuchElementException();
return contenido[pos++];
}
public void remove(){
throw new UnsupportedOperationException();
}
};
}
El lenguaje de programación Java
29
Ventajas de la clases anidadas e internas
• Reduce los conflictos de nombres. Proporciona una
organización estructural adicional a los paquetes y clases.
– Ejemplo: Lista.Nodo, Arbol.Nodo
• Implementar una clase (la clase interna) que necesite
acceder a la estructura interna de otra porque necesite
devolver objetos con privilegios.
– Ejemplo: iterador sobre un escenario
• Callbacks-Simplifica la gestión de eventos (GUI).
El lenguaje de programación Java
30