vi Colecciones interfaz Collection clases Array List Linked

  • Slides: 30
Download presentation
vi. Colecciones - interfaz Collection - clases Array. List, Linked. List, Hash. Set, Tree.

vi. Colecciones - interfaz Collection - clases Array. List, Linked. List, Hash. Set, Tree. Set - interfaz Map - clases Tree. Map, Hash. Map - Iteratores: interfaz Iterator vii. Clases anidadas e internas El lenguaje de programación Java

Colecciones en Java • Permite almacenar y organizar objetos de manera útil para un

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. Unsupported. Operation. Exception) • Sobre los elementos se puede iterar (Iterator) El lenguaje de programación Java

Jerarquía de colecciones devuelve Iterator devuelve Collection Map devuelve List. Iterator List Set Abstract.

Jerarquía de colecciones devuelve Iterator devuelve Collection Map devuelve List. Iterator List Set Abstract. Collection Abstract. List Tree. Map Abstract. Map Hash. Map Abstract. Set Hash. Set Array. List Sorted. Set Sorted. Map Abstract. Sequential. List Linked. List Tree. Set extends implements interface class 3

Interfaz Collection (1/2) - Collection - int size() boolean empty() boolean contains(Object elem) Iterator

Interfaz Collection (1/2) - Collection - int size() boolean empty() boolean contains(Object elem) Iterator iterator() Object[] to. Array(), Object[] to. Array(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 index. Of(Object o) int last. Index. Of(Object o) List sub. List(int min, int max)

Interfaz Collection (2/2) -Set – Una colección (conjunto) donde no puede haber elementos repetidos,

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. -Sorted. Set – Conjunto con elementos ordenados. -Object first() -Object last() -Sorted. Set sub. Set(Object from. Element, Object to. Element) -Sorted. Set head. Set(Object to. Element) -Sorted. Set tail. Set(Object from. Element)

Interfaz Map - Un objeto que asocia claves con valores. - No puede tener

Interfaz 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); – contains. Key, contains. Value, is. Empty, size - Proporciona tres vistas de colección: colección de claves (key. Set), colección de valores (values), colección de asociaciones clave-valor (entry. Set). - Sorted. Map: Un mapa cuyas claves están ordenadas. - Object first. Key(), Object last. Key(), Sorted. Map sub. Map(Object min. Key, Object max. Key), Sorted. Map head. Map(Object max. Key), Sorted. Map tail. Map(Object min. Key) El lenguaje de programación Java

Iteración • Collection >> Iterator iterator(); interface Iterator{ boolean has. Next(); /* Devuelve true

Iteración • Collection >> Iterator iterator(); interface Iterator{ boolean has. Next(); /* Devuelve true si la iteración tiene mas elementos */ Object next(); /* Devuelve el siguiente elemento de la iteración Lanza excepción No. Such. Element. Exception */ void remove(); /* Elimina el último elemento devuelto por la iteración Está capacitado para decir que no lo implementa Unsupported. Operation. Exception */ } • La interfaz List. Iterator extiende a Iterator y maneja un objeto List ordenado. Permite iterar hacia delante y hacia El lenguaje de programación Java atrás.

Ejemplo de uso de Iteradores • Cálculo del gasto total de un departamento public

Ejemplo de uso de Iteradores • Cálculo del gasto total de un departamento public double gasto. Dpto(){ double gasto=0; Iterator it=plantilla. iterator(); while (it. has. Next()){ gasto+=((Empleado)it. next()). get. Sueldo(); } return gasto; } Siendo plantilla una colección que implemente la interfaz Collection El lenguaje de programación Java

Implementaciones de Collection -Linked. List – Una implementación de una lista doblemente enlazada. La

Implementaciones de Collection -Linked. List – 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. -get. First, get. Last, remove. First, remove. Last, add. First, add. Last -Array. List – 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. -Hash. Set – 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. -Tree. Set – Un Sorted. Set implementado utilizando un árbol binario equilibrado. Es más lento para buscar o modificar que un Hash. Set, 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

Convenciones sobre excepciones • Unsupported. Operation. Exception – Métodos opcionales en la implementación de

Convenciones sobre excepciones • Unsupported. Operation. Exception – Métodos opcionales en la implementación de una interfaz • Class. Cast. Exception – El tipo del elemento que se desea insertar no es del tipo apropiado • Illegal. Argument. Exception – El valor del elemento no es apropiado para la colección • No. Such. Element. Exception – La colección de la que se quiere devolver un elemento está vacía • Null. Pointer. Exception – Se pasa como argumento una referencia con valor null cuando la colección no admite este valor. El lenguaje de programación Java

Declaración de colecciones Clase concreta import java. util. *; public class Coleccion. Simple {

Declaración de colecciones Clase concreta import java. util. *; public class Coleccion. Simple { public static void main( String args[] ) { List c = new Array. List(); for( int i=0; i < 10; i++ ) c. add(new Integer(i)); interfaz Iterator it = c. iterator(); while( it. has. Next() ) System. out. println(it. next()); } } El lenguaje de programación Java

Implementaciones de Map • Hash. Map - Una implementación de Map con una tabla

Implementaciones de Map • Hash. Map - Una implementación de Map con una tabla hash. - El método hash. Code 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. • Tree. Map – Una implementación de Sorted. Map 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

Ejemplo 1/2 • Generar números al azar (Math. random) y contar cuantas veces sale

Ejemplo 1/2 • Generar números al azar (Math. random) y contar cuantas veces sale cada uno. • Hash. Map = 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 to. String() { return Integer. to. String(i); } } El lenguaje de programación Java

Ejemplo 2/2 class Estadistico { public static void main( String args[] ) { Hash.

Ejemplo 2/2 class Estadistico { public static void main( String args[] ) { Hash. Map tabla = new Hash. Map(); 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. contains. Key(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 }

Las utilidades de Collections • public static Object min(Collection col) • public static Object

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, Comparator comp) • public static int binary. Search(List lista, Object clave, Comparator comp) El lenguaje de programación Java

Conclusiones • Si un método tiene que devolver (pasar como parámetro) una colección de

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 Array. List(); – Excepción: Linked. List si la utilizamos como pila o cola. • Utilizar SIEMPRE Iterator para el recorrido de cualquier colección. El lenguaje de programación Java

Clases anidadas e internas • Un clase o interfaz se puede declarar dentro de

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 Clase. Externa$Clase. Interna. class El lenguaje de programación Java

Clases anidadas estáticas • El modificador static precede al nombre de la clase. •

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: Clase. Externa. Clase. Anidada var; El lenguaje de programación Java

Ejemplo: Definir estructura de datos asociadas class Pila { private Nodo cabeza; private static

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 }

Clases internas • Clases anidadas no estáticas. • Un objeto de la clase interna

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

Ejemplo: Creación del objeto de la clase interna dentro de un método de instancia

Ejemplo: Creación del objeto de la clase interna dentro de un método de instancia de la clase envolvente class Cuenta. Bancaria{ private long numero; private long saldo; private Operacion ultima. Op; } private class Operacion{ String descripcion; long cantidad; . . . public String to. String(){ return numero + “: ”+ descripcion+” “+cantidad; } }. . . public void reintegro(long cantidad){ saldo -=cantidad; ultima. Op= new Operacion(“reintegro”, cantidad); } El lenguaje de programación Java

Ejemplo: acceso a métodos ocultos class Externa{ void imprimir(){} class Interna{ void imprimir(){} //oculta

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

Ejemplo: Acceso a todos lo miembros de quien lo contiene interface Iterator{ boolean has.

Ejemplo: Acceso a todos lo miembros de quien lo contiene interface Iterator{ boolean has. Next(); 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 }

Ejemplo (continuación) //Clase interna accede al atributo contenido de la clase Secuencia private class

Ejemplo (continuación) //Clase interna accede al atributo contenido de la clase Secuencia private class CIterator implements Iterator{ private int pos=0; public boolean has. Next(){ return (pos < contenido. length); } public Object next(){ if (pos >= contenido. length) throw new No. Such. Element. Exception(); return contenido[pos++]; } public void remove(){ throw new Unsupported. Operation. Exception(); } }//Fin de la clase Interna public Iterador iterador(){ return new CIterador(); } } //Fin de la clase Secuencia El lenguaje de programación Java

Uso del iterador de la clase Secuencia s = new Secuencia(10); . . .

Uso del iterador de la clase Secuencia s = new Secuencia(10); . . . Iterator iter = s. iterator(); while (iter. has. Next()){ 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

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

Ejemplo: Iterador creado dentro de un método public Iterator iterator(){ class CIterador implements Iterator{

Ejemplo: Iterador creado dentro de un método public Iterator iterator(){ class CIterador implements Iterator{ private int pos=0; public boolean has. Next(){ return (pos < contenido. length); } public Object next(){ if (pos>= contenido. length) throw new No. Such. Element. Exception(); return contenido[pos++]; } public void remove(){ throw new Unsupported. Operation. Exception(); } } return new CIterador(); } El lenguaje de programación Java

Clases internas anónimas • Se definen en el mismo momento en el que se

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 Super. Clase var = new Super. Clase (valor){ public void met(Object obj){ //redefinicion de met } }; El lenguaje de programación Java

Ejemplo: Iterador anónimo public Iterator iterator(){ return new Iterator(){ private int pos=0; public boolean

Ejemplo: Iterador anónimo public Iterator iterator(){ return new Iterator(){ private int pos=0; public boolean has. Next(){ return (pos < contenido. length); } public Object next(){ if (pos>= contenido. length) throw new No. Such. Element. Exception(); return contenido[pos++]; } public void remove(){ throw new Unsupported. Operation. Exception(); } }; } El lenguaje de programación Java

Ventajas de la clases anidadas e internas • Reduce los conflictos de nombres. Proporciona

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