Sunteți pe pagina 1din 14

COLECCIONES

Introduccin Un tema que aparece frecuentemente en la programacin es el de organizar una coleccin de objetos en memoria. Este tema tambin es conocido con el ttulo estructuras de datos, y se relaciona tambin a distintos algoritmos para agilizar el acceso. Antes de hablar especficamente de las colecciones de Java voy a desviarme un rato hablando un poco sobre el problema en general de almacenar colecciones de datos en memoria. Algoritmos y estructuras de datos Todo programador aprende, apenas empieza, un par de estructuras de datos simples. Podramos decir que la primer estructura de datos es la variable. Almacena un solo objeto, y el tiempo de acceso es nfimo. La segunda estructura de datos que siempre se aprende es el arreglo (en ingls "array"). Esta coleccin nos permite obtener un valor dado una posicin en una tabla. Es muy veloz ya que esta estructura tiene un fuerte paralelo con cmo se organiza internamente la memoria de una computadora. Los valores en un arreglo estn en orden, y en ese mismo orden estn dispuestos en la memoria, por lo tanto el acceso lo maneja directamente el hardware (porque la memoria funciona fsicamente como un arreglo). Un arreglo en Java se hace as (pero asumamos que ya se sabe). String[] nombres = new String[10]; Muchos programadores se detienen aqu. Ayuda a esto el hecho de que en algunos lenguajes el arreglo era la estructura de datos ms compleja soportada (por ejemplo en BASIC... o incluso C!). Uno puede usar arreglos para todo. Quiero guardar la lista de helados que me gusta? Las notas que se sacaron los alumnos de una clase? La coleccin de coordenadas que forman un mapa? Puede guardarse en un arreglo... ahora... supongamos que quiero guardar las notas de los alumnos de una clase. Si quiero usar un arreglo podra actuar as: Creo una clase con el nombre del alumno y su nota: class Nota { String alumno; int nota; Nota(String alumno, int nota) { this.alumno = alumno; this.nota = nota; } public int getNota() { return nota; } public String getAlumno() { return alumno; } } Introduccin Un tema que aparece frecuentemente en la programacin es el de organizar una coleccin de objetos en memoria. Este tema tambin es conocido con el ttulo estructuras de datos, y se relaciona tambin a distintos algoritmos para agilizar el acceso. Antes de hablar especficamente de las colecciones de Java voy a desviarme un rato hablando un poco sobre el problema en general de almacenar colecciones de datos en memoria.

Algoritmos y estructuras de datos Todo programador aprende, apenas empieza, un par de estructuras de datos simples. Podramos decir que la primer estructura de datos es la variable. Almacena un solo objeto, y el tiempo de acceso es nfimo. La segunda estructura de datos que siempre se aprende es el arreglo (en ingls "array"). Esta coleccin nos permite obtener un valor dado una posicin en una tabla. Es muy veloz ya que esta estructura tiene un fuerte paralelo con cmo se organiza internamente la memoria de una computadora. Los valores en un arreglo estn en orden, y en ese mismo orden estn dispuestos en la memoria, por lo tanto el acceso lo maneja directamente el hardware (porque la memoria funciona fsicamente como un arreglo). Un arreglo en Java se hace as (pero asumamos que ya se sabe). String[] nombres = new String[10]; Muchos programadores se detienen aqu. Ayuda a esto el hecho de que en algunos lenguajes el arreglo era la estructura de datos ms compleja soportada (por ejemplo en BASIC... o incluso C!). Uno puede usar arreglos para todo. Quiero guardar la lista de helados que me gusta? Las notas que se sacaron los alumnos de una clase? La coleccin de coordenadas que forman un mapa? Puede guardarse en un arreglo... ahora... supongamos que quiero guardar las notas de los alumnos de una clase. Si quiero usar un arreglo podra actuar as: Creo una clase con el nombre del alumno y su nota: class Nota { String alumno; int nota; Nota(String alumno, int nota) { this.alumno = alumno; this.nota = nota; } public int getNota() { return nota; } public String getAlumno() { return alumno; } } agrega un nuevo alumno? Habr que insertarlo en la posicin correcta de acuerdo al orden alfabtico y desplazar a todos lo que queden a su derecha un lugar. En el peor caso es recorrer todo el arreglo! Todo esto quiere decir que el tipo de estructura de datos que se use depender de lo que puede asumir de la coleccin almacenada y de cmo se espera que esa coleccin sea usada (cmo sea leda y cmo sea modificada). Algunas preguntas a hacerse son: Me interesa mantener el orden abitrario original? Puedo (como con las notas) reordenar los tems? Hay duplicados? Con qu frecuencia es necesario aadir nuevos elementos?

Collection
La interfaz ms importante es Collection. Una Collection es todo aquello que se puede recorrer (o iterar) y de lo que se puede saber el tamao. Muchas otras clases extendern Collection imponiendo ms restricciones y dando ms funcionalidades. Es de notar que el requisito de que se sepa el tamao hace inconveniente utilizar estas clases con colecciones de objetos de las que no se sepa a priori la cantidad (sto podra considerarse una limitacin de este framework). Por las dudas vuelvo a aclarar: No puedo construir una Collection. No se puede hacer new de una Collection, sino que todas las clases que realmente manejan colecciones son Collection, y admiten sus operaciones. Las operaciones bsicas de una collection entonces son:
add(T)

Aade un elemento.
iterator()

Obtiene un iterador que permite recorrer la coleccin visitando cada elemento una vez.
size()

Obtiene la cantidad de elementos que esta coleccin almacena.


contains(t)

Pregunta si el elemento t ya est dentro de la coleccin. Si yo tengo un objeto Collection hay muchas cosas que no puedo asumir. No puedo asumir que el orden en el que lo recorro sea relevante, es decir, que si lo recorro de nuevo vea los elementos en el mismo orden en el que los vi la primera vez. Tampoco puedo asumir que no hay duplicados. No puedo asumir caractersticas de rendimiento: Preguntar si existe un objeto en la coleccin puede tardar desde muy poco hasta... mucho =). Una capacidad de un objeto Collection es la de poder ser recorrido. Como a este nivel no est definido un orden, la nica manera es proveyendo un iterador, mediante el mtodo iterator(). Un iterador es un objeto paseador que nos permite ir obteniendo todos los objetos al ir invocando progresivamente su mtodo next(). Tambin, si la coleccin es modificable, podemos remover un objeto durante el recorrido mediante el mtodo remove() del iterador. El siguiente ejemplo recorre una coleccin de Integer borrando todos los ceros:

void borrarCeros(Collection<Integer> ceros)

{ Iterator<Integer> it = ceros.iterator(); while(it.hasNext()) { int i = it.next(); if(i == 0) it.remove(); } }

En este ejemplo hago uso de la conversin automtica entre Integer e int. A partir de Java 6 hay una manera simplificada de recorrer una collection (que sirve si no necesitamos borrar elementos). Se hace mediante un nuevo uso del keyword for:

void mostrar(Collection<?> col) { for(Object o : col) System.out.println(o); }

Internamente este cdigo no hace otra cosa que obtener el iterador, pero queda mucho ms elegante y legible de esta manera. Pero al mismo tiempo, el no disponer del iterador explcitamente hace imposible usar esta sintaxis para hacer lo que hice en el ejemplo previo: ir borrando elementos. Hay cuatro interfaces que extienden Collection: List, Set, Map y Queue. Cada una de ellas agrega condiciones sobre los datos que almacena y como contrapartida ofrece ms funcionalidad. A continuacin cuento de qu se trata cada una de ellas.

List
Un List, o simplemente lista, es una Collection. La diferencia que tiene una lista con una Collection es que la lista mantiene un orden arbitrario de los elementos y permite acceder a los elementos por orden. Podramos decir que en una lista, por lo general, el orden es dato. Es decir, el orden es informacin importante que la lista tambin nos est almacenando. No hay ningn mtodo en Collection para obtener el tercer elemento. No lo puede haber porque, como se dijo, a nivel Collection ni siquiera estamos seguros de que si volvemos a recorrer la coleccin los elementos aparecern en el mismo orden. Una lista s debe permitir acceder al tercer elemento, por eso se aaden los siguientes mtodos:

get(int i)

Obtiene el elemento en la posicin i.


set(int i, T t)

Pone al elemento t en la posicin i. Existen en Java principalmente dos implementaciones de List, las dos tiles en distintos casos. Una de ellas es casi igual a los arreglos comunes (como el de notas que usaba ms arriba para ejemplificar). Esta implementacin es ArrayList. La ventaja de ArrayList por sobre un array comn es que es expansible, es decir que crece a medida que se le aaden elementos (mientras que el tamao de un array es fijo desde su creacin). Lo bueno es que el tiempo de acceso a un elemento en particular es nfimo. Lo malo es que si queremos eliminar un elemento del principio, o del medio, la clase debe mover todos los que le siguen a la posicin anterior, para tapar el agujero que deja el elemento removido. Esto hace que sacar elementos del medio o del principio sea costoso. La otra implementacin es LinkedList (lista enlazada). En sta, los elementos son mantenidos en una serie de nodos atados entre s como eslabones de una cadena. Cada uno de estos nodos apunta a su antecesor y al elemento que le sigue. Nada ms. No hay nada en cada uno de esos nodos que tenga algo que ver con la posicin en la lista. Para obtener el elemento nmero n, esta implementacin de List necesita entonces empezar desde el comienzo, desde el primer nodo, e ir avanzando al siguiente n veces. Buscar el elemento 400 entonces implica 400 de esos pasitos. La ventaja es que es posible eliminar elementos del principio de la lista y del medio de manera muy eficiente. Para eliminar un elemento solamente hay que modificar a sus dos vecinos para que se conecten entre s ignorando al elemento que se est borrando. Como en una cadena, se retira un eslabn abriendo los eslabones adyacentes al que se elimin y cerrndolos de modo que lo excluyan. No es necesario hacerle ningn cambio al resto de los elementos de la lista. En otros lenguajes lidiar con listas enlazadas puede ser un poco ms trabajoso. En Java, LinkedList se usa exactamente igual que otros tipos de List, por lo que no hay que saber nada adicional para empezar a usarla. Bueno, esto no es del todo cierto... hay que tener muy en claro sus particularidades en cuanto a rendimiento. Su mtodo get(int) es particularmente lento porque, como dije, necesita recorrer para llegar al elemento pedido. Esto hace que recorrer la ista con un simple for(int i = 0 ; i < lista.size(); i++) sea tremendamente lento! La complejidad pasa de ser lineal a cuadrtica, es decir: Si se recorre as una lista de 300 elementos, se tarda como si tuviera 44.850 elementos! Una LinkedList slo debe recorrerse mediante iteradores. Un uso ideal de LinkedList es para la creacin de colas, en las que los elementos se aaden al final, y se eliminal del comienzo. Para este uso se puede usar, en vez de List, la

interfaz Queue (tambin implementada por LinkedList) que es ms especfica para esta tarea.

Set
Un Set es una Collection. Set es la palabra inglesa para conjunto y los desarrolladores de Java estaban pensando en lo que matemticamente se conoce como conjunto. Por sobre lo que es una collection, un set agrega una sola restriccin: No puede haber duplicados. Por lo general en un set el orden no es dato. Si bien es posible que existan sets que nos aseguren un orden determinado cuando los recorremos (por ejemplo obtener strings en orden alfabtico), ese orden no es arbitrario y decidido por nosotros, ya que la interfaz Set no tienen ninguna funcionalidad para manipularlo (como si lo admite la interfaz List). La ventaja de utilizar Sets es que preguntar si un elemento ya est contenido mediante contains() suele ser muy eficiente. Entonces es conveniente utilizarlos cada vez que necesitemos una coleccin en la que no importe el orden, pero que necesitemos preguntar si un elemento est o no. Como, a diferencia de Collection, el orden no necesariamente es preservado, no existen mtodos para obtener el primer elemento.

HashSet Existen varias implementaciones de Set. La ms comunmente usada es HashSet. Los Sets (y los Maps) aprovechan cierta cosa caracterstica de Java: Todos los objetos heredan de Object, por lo tanto todos los mtodos de la clase Object estn presentes en todos los objetos. Dicho de otra manera, hay ciertas cosas que todo objeto en Java sabe hacer. Dos de estas cosas son:

Saber si es igual a otro, con su mtodo equals(). Devolver un nmero entero de modo tal que si dos objetos son iguales ese nmero tambin lo ser (se conoce esto como un hash). Esto todo objeto lo sabe hacer con su mtodo hashCode().

La clase HashSet aprovecha la segunda de las funciones. A cada objeto que se aade a la coleccin se le pide que calcule su hash. Este valor ser un nmero entre -2147483647 y 2147483648. Basado en ese valor se lo guarda en una tabla. Ms tarde, cuando se pregunta con contains() si un objeto x ya est, habr que saber si est en esa tabla. En qu posicin

de la tabla est? HashSet puede saberlo, ya que para un objeto determinado, el hash siempre va a tener el mismo valor. Entonces la funcin contains de HashSet saca el hash del objeto que le pasan y va con eso a la tabla. En la posicin de la tabla hay una lista de objetos que tienen ese valor de hash, y si uno de esos es el buscado contains devuelve true. Un efecto de este algoritmo es que el orden en el que aparecen los objetos al recorrer el set es impredecible. Tambin es importante darse cuenta de que es crtico que la funcin hashCode() tiene que devolver siempre el mismo valor para los objetos que se consideran iguales (o sea que equals() da true). Si esto no es as, HashSet pondr al objeto en una posicin distinta en la tabla que la que ms adelante consultar cuando se llame a contains, y entonces contains dar siempre falso, por ms que se haya hecho correctamente el add. Esto mismo puede suceder si se usan como claves objetos que varen.

TreeSet Antes de entrar en la descripcin de TreeSet vaya una breve explicacin. Otra cosa que pueden saber hacer los objetos con independencia de cmo y dnde son usados es saber ordenarse. A diferencia de equals y hashCode, que estn en todos los objetos, la capacidad de ordernarse est slo en aquellos que implementan la interfaz Comparable. Cuando un objeto implementa esta interfaz promete saber compararse con otros (con el mtodo compareTo()), y responder con este mtodo si l est antes, despus o es igual al objeto que se le pasa como parmetro. Al orden resultante de usar este mtodo se le llama en Java orden natural. Muchas de las clases de Java implementan Comparable, por ejemplo String lo hace, definiendo un orden natural de los strings que es el obvio, el alfabtico. Tambin implementan esta interfaz Date, Number, etc. y los rdenes naturales que definen estas implementaciones tambin los los que uno esperara. Si yo creo una clase ma llamada Alumno, queda a mi cargo, si as lo quiero, la definicin de un orden natural para los alumnos. Puedo elegir usar el apellido, el nombre, el nmero de matrcula, etc. De acuerdo al atributo que elija para definir el orden natural codificar el mtodocompareTo(). Lo que es importante es que la definicin de este mtodo sea compatible con el equals(); esto es que a.equals(b) si y slo si a.compareTo(b) == 0. TreeSet usa una tcnica completamente diferente a la explicada para HashSet. Construye un rbol con los objetos que se van agregando al conjunto. Un rbol es una forma en computacin de tener un conjunto de cosas todo el tiempo en orden, y permitir que se agreguen ms cosas y que el orden se mantenga. Al tener todo en orden TreeSet puede fcilmente saber si un objeto est, por medio de una tcnica similar a la explicada en el comienzo de este artculo para buscar los nombres de las notas.

Una ventaja de TreeSet es que el orden en el que aparecen los elementos al recorrerlos es el orden natural de ellos (los objetos debern implementar Comparable, como lo explico arriba; si no lo hacen se deber especificar una funcin de comparacin manualmente). Una desventaja es que mantener todo ordenado tiene un costo, y esta clase es un poquito menos eficiente que HashSet.

Map
Un Map representa lo que en otros lenguajes se conoce como diccionario y que se suele asociar a la idea de tabla hash (aunque no se implemente necesariamente con esa tcnica). Un Map es un conjunto de valores, con el detalle de que cada uno de estos valores tiene un objeto extra asociado. A los primeros se los llama claves o keys, ya que nos permiten acceder a los segundos. Cuando digo que las claves forman un conjunto, lo digo en el sentido Java: Son un Set, no puede haber duplicados. En otros lenguajes existen estructuras parecidas que admiten la existencia de claves duplicadas (a veces conocidos como multimap). La nica manera de lograr esto en Java es haciendo que el map guarde listas de valores en vez de los valores sueltos. Un Map no es una Collection ya que esa interfaz le queda demasiado chica. Podramos decir que Collection es unidimensional, mientras que un Map es bidimensional. No hay una manera trivial de expresar un Map en una simple serie de objetos que podemos recorrer. S podramos recorrer una serie de objetos si cada uno de ellos representase un par {clave, valor} (y de hecho eso se puede hacer). Pero esta forma de recorrer un Map no es la forma primaria en que se usa. Algunos de los mtodos ms importantes de un Map son: get(Object clave) Obtiene el valor correspondiente a una clave. Devuelve null si no existe esa clave en el map. put(K clave, V valor) Aade un par clave-valor al map. Si ya haba un valor para esa clave se lo reemplaza. Adems hay algunas funciones que son tiles a la hora de recorrer eficientemente el contenido de un Map: keySet() Todas las claves (devuelve un Set, es decir, sin duplicados). values()

Todos los valores (los valores s pueden estar duplicados, por lo tanto esta funcin devuelve una Collection). entrySet() Todos los pares clave-valor (devuelve un conjunto de objetos Map.Entry, cada uno delos cuales devuelve la clave y el valor con los mtodos getKey() y getValue() respectivamente).

HashSet
Un HashSet es una estructura de datos que contiene un conjunto de objetos. Permite buscar un objeto dentro del conjunto de forma rpida y fcil. Internamente gestiona un array y guarda los objetos utilizando un ndice calculado con un cdigo hash del objeto. - Los elementos de un HashSet no estn ordenados - Para aadir un elemento al HashSet se utiliza el mtodo add(Object obj). - Para borrar un elemento se utiliza remove(Object obj). - Para borrar todos los elementos se utiliza clear(). - El tamao del HashSet se puede obtener con la funcin size()

HashMap
Un HashMap permite guardar elementos, donde cada elemento es un par clave/valor. A diferencia de un array simple donde se guarda el valor en un ndice en concreto, un HashMap determina el ndice l mismo basndose en el valor hash (hashcode) generado a partir de la clave.

TreeSet
Un TreeSet mantiene los objetos ordenados en lo que se conoce como un red-black tree, es decir, en un rbol binario balanceado (cada padre tiene como mximo 2 hijos, y cuando se inserta una entrada se autobalancea de forma que quede un rbol binario simtrico). Un TreeSet permite hacer bsquedas rpidas. No tanto como un HashMap, pero el TreeSet tiene la ventaja de estar ordenado por clave.

Ejemplo de Colecciones
ver en popupcopiar a portapapelesimprimir

1. import java.util.*; 2. public class Colecciones { 3. public static void main(String[] args) { 4. List lista1 = new LinkedList(); 5. lista1.add("elemento1"); 6. lista1.add("elemento2"); 7. lista1.add("elemento3"); 8. mostrar_elementos(lista1); 9. List lista2 = new ArrayList(); 10. lista2.add("elemento1"); 11. lista2.add("elemento2"); 12. lista2.add("elemento3"); 13. mostrar_elementos(lista2); 14. Set conjunto1 = new HashSet(); 15. conjunto1.add("elemento1"); 16. conjunto1.add("elemento2"); 17. conjunto1.add("elemento3"); 18. mostrar_elementos(conjunto1); 19. SortedSet conjunto2 = new TreeSet(); 20. conjunto2.add("elemento1"); 21. conjunto2.add("elemento2"); 22. conjunto2.add("elemento3"); 23. mostrar_elementos(conjunto2); 24. Map mapa1 = new HashMap(); 25. mapa1.put("clave1", "elemento1"); 26. mapa1.put("clave2", "elemento2"); 27. mapa1.put("clave3", "elemento3"); 28. mostrar_elementos(mapa1.keySet()); 29. mostrar_elementos(mapa1.values()); 30. SortedMap mapa2 = new TreeMap(); 31. mapa2.put("clave1", "elemento1"); 32. mapa2.put("clave2", "elemento2"); 33. mapa2.put("clave3", "elemento3"); 34. mostrar_elementos(mapa2.keySet()); 35. mostrar_elementos(mapa2.values()); 36. } 37. static void mostrar_elementos(Collection coleccion) { 38. Iterator iterador = coleccion.iterator(); 39. while (iterador.hasNext()) { 40. String elemento = (String) iterador.next(); 41. System.out.print(elemento + " "); 42. } 43. System.out.println(); 44. } 45. }

Diferencias entre las colecciones List, Set y Map

Las colecciones son objetos que contienen objetos y que se usan para almacenar, obtener, manipular y comunicar datos incluidos en stas. Normalmente, los objetos includos en ellas suelen ser del mismo tipo, aunque no necesariamente, depende de si son o no genricas. Las colecciones se diferencian de los arrays en que su tamao no es fijo, esto es, son dinmicas. Se pueden realizar operaciones de incluir, eliminar, obtener, encontrar o recorrer una coleccin. La Java Collections Framework (JCF) est constituda por sus interfaces (las ms importantes List, Set y Map), interfaces de soporte (Iterator, ListIterator, Comparable y Comparator) y de clases de distintos usos, es decir, las implementaciones de las interfaces, y que sirven para almacenar y manipular grupos de datos como una sola unidad, como una coleccin (HashSet, TreeSet, ArrayList, LinkedList, HashMap, TreeMap, etc.). Tambin hay clases abstractas que tienen total o parcialmente implementados los mtodos de la interface correspondiente, y que sirven para que los usuarios deriven de ellas sus propias clases de forma ms sencilla.

Dos clases que implementan la misma interface se pueden utilizar exactamente de la misma forma, aunque difieran en cuanto a la implementacin y, por tanto, su eficiencia. Interfaces Comparable y Comparator Sirven para mantener ordenadas las listas, as como los sets y los maps que deban mantener un orden. Comparable declara el mtodo compareTo() que compara su argumento implcito por el que se le pasa por parmetro, devolviendo -1, 0 1 segn el argumento sea anterior, igual o posterior al objeto o:

public int compareTo(Object o); Comparatorpermite ordenar listas y colecciones cuyos objetos pertenecen a clases de cualquier tipo. La idea es parecida a la de Comparable, pero el usuario debe proporcionar la implementacin de la interface. Esta interface declara los mtodos equals(), que compara dos Comparators, y compare(), que devuelve -1, 0 1 segn el argumento sea anterior, igual o posterior al segundo: public boolean equals(Object o); public int compare(Object o1, Object o2); ______________________ Vamos a analizar las interfaces mms importantes de la JCF: INTERFACE LIST Se encarga de definir mtodos para trabajar con colacciones ordenadas y con elementos repetidos. Algunos de los mtodos de la interface List son los siguientes:

add(Object o): aade un objeto al final de la lista. add(int indice, Object o): aade un objeto a la lista en la posicin indicada. get(int indice): devuelve el objeto de la lista de la posicin indicada. remove(int indice): elimina el objeto de la lista pasado por parmetro. clear(): elimina todos los elementos de la lista. indexOf(Object o): devuelve la posicin de la primera vez que un elemento coincida con el objeto pasado por parmetro. Si el elemento no se encuentra devuelve -1. lastIndexOf(Object o):devuelve la posicin de la ltima vez que un elemento coincida con el objeto pasado por parmetro. Si el elemento no se encuentra devuelve -1. size(): devuelve el nmero de elementos de la lista. contains(Object o): devuelve verdadero si en la lista aparece el objeto pasado por parmetro, para lo cual utiliza intrnsecamente el mtodo equals(). Existen implementaciones de la interface List, como son las clases ArrayList y LinkedList. Hay otras dos que no voy a comentar: Vector(h) y Stack(h). ArrayList se basa en ndices, siendo cero la posicin inicial e infinito su posicin final, o lo que es lo mismo, contiene tantos objetos como necesitemos, almacenando los elementos en un array de objetos. Esta clase tiene varios constructores, siendo la ms importante el ArrayList(), que construye un ArrayList con capacidad cero por defecto pero con infinitos objectos a insertar. Si le queremos dar un tamao empleamos el constructor ArrayList(int numElementos). ArrayList implementa la interfaz List y extiende de la clase abstracta AbstractList. LinkedList almacena los elementos en una lista vinculada y permiten un acceso a ella de manera secuencial, pero su uso no es tan eficiente como los arrays. INTERFACES SET <E> y SORTEDSET <E> Sirve para acceder a una coleccin sin elementos repetidos (hay que saber cundo dos objetos son considerados

iguales; para ello se usan equals() y hashcode();). Puede estar o no ordenada, y no declara ningn mtodo adicional a los de Collection. Algunos de los mtodos de la interface Set son los siguientes:

add(Object o): aade el objeto pasado por parmetro al Set siempre que ste no exista ya, y devuelve un booleano. clear(): Elimina a todos los elementos del Set. contains(Object o): devuelve true si el Set contiene el objeto pasado por parmetro. Para ello, se compara de forma interna con el mtodo equals (o.equals(x);) o con el mtodo hashCode(). isEmpty(): devuelve true si el Set est vaco. iterator(): devuelve un iterador remove(Object o): elimina el objeto pasado por parmetro si existe y devuelve un booleano. size(): devuelve un entero que es el nmero de elementos del Set. La interface SortedSet extiende de la interface Set y aade una serie de mtodos, entre los que hay que destacar:

comparator(): obtiene el objeto pasado al constructor para establecer el orden; si se emplea el orden natural definido por la interface Comparable, devuelve null; first() / last(): devuelve el primer o el ltimo elemento del conjunto. Existen dos implementaciones de conjuntos, como son la clase HashSet y la clase TreeSet. HashSet<Elemento> Implementa la inteface Set y est basada en una hash table. Hace distincin de identidad, esto es, que slo pueden existir elementos diferentes (nada de duplicados). No se respeta el orden en el que se insertan los elementos y el tamao del conjunto se adapta dinmicamente a lo que se necesite. HashSet implementa la interfaz Set y extiende de la clase abstracta AbstractSet. TreeSet <Elemento> Implementa SortedSet y se basa en un TreeMap. INTERFACES MAP<Clave, Valor> y SORTEDMAP<Clave, Valor> Un Map es una estructura de datos agrupados en parejas clave/valor; pueden ser considerados como una tabla de dos columnas. La clave debe ser nica y se emplea para acceder al valor. Map no deriva de Collection, pero s se pueden ver los Maps como colecciones de claves, de valores o de claves/valores. Algunos de los mtodos de la interface Map son los siguientes:

clear(): elimina todos los mapeos del Map. containsKey(Object clave): devuelve true si el Map contiene un mapeo igual que el objeto pasado por parmetro: boolean existe = productos.containsKey(producto); containsValue(Object valor): devuelve true si el Map mapea a uno o ms claves del objeto valor pasado por parmetro.

get(Object clave): devuelve el objeto valor de la clave pasada por parmetro; o null si el Map no encuentra ningn mapeo con esta clave. isEmpty(): devuelve true si el Map est vaco. put(Clave clave, Valor valor): asigna el valor pasado con la clave especificada a otro objeto valor. remove(Object clave): elimina el mapeo que tenga la clave pasada por parmetro si existe, devolviendo el valor de dicho mapeo. size(): devuelve un entero con el nmero de mapeos del Map. La interface SortedMap aade mtodos similares a los de SortedSet. Existen tres implementaciones como son las clases HashMap, HashTable(h) y TreeMap. HashMap<Clave,Valor> esta clase mapea claves con valores, pero no permite claves duplicadas porque se solapara el valor. Tanto la clave como el valor pueden ser cualquier tipo de objeto, y ambos pueden tener el valor null. Esta clase no garantiza el orden de los elementos ni que no puedan cambiar de orden. HashMap implementa la interfaz Map y extiende de la clase abstracta AbstractMap. Esta clase posee internamente (de la clase AbstractMap) los mtodos equals, hashCode y toString. HashTable<Clave,Valor> Es una clase que implementa Map y que almacena pares del tipo clave/valor en una tabla de dispersin. Al emplearla se proporciona un objeto que sirve como clave y otro como valor (vinculando el valor a la clave).Su insercion y bsqueda es rpida. Un ejemplo sera un listn de telfonos, en el que dado un nombre se proporciona un telfono.

S-ar putea să vă placă și