lunes, 7 de enero de 2013

Colecciones: Interfaz Set

Buenas amigos, en temas anteriores estuvimos comentado de las colecciones y profundizamos un poco más en la interfaz List. En este nuevo tema vamos a ver la interfaz Set y las 3 subclases más importantes que la componen.

Esta interfaz tiene una peculiaridad, y es que no admite duplicados y es especialmente útil para ir almacenando datos sin la preocupación de que alguno se repita. Estos elementos o datos pueden estar ordenados o no.

 Esta Interfaz, al igual que List, nos proporciona métodos para:

    • Añadir un elemento a la colección
    • Eliminar un elemento de la colección
    • Obtener un elemento de la colección
    • localizar un elemento en la colección
    • Iterar sobre la colección.
Vamos a ver, como ya hicimos con la interfaz List, como crear y utilizar esta interfaz por medio de sus subclase.

HashSet

Representa un conjunto de valores únicos sin ordenar, no puede tener valores duplicados. Tiene una iteración más rápida que ArrayList, por lo tanto si queremos tener un conjunto de elementos únicos sin importarnos si están ordenados o no, está es nuestra elección.

Para construir un HashSet hacemos:
                • HashSet nomVariable=new HashSet();
Los métodos más comunes de esta colección son:
    • boolean add(object o): Añade un nuevo objeto a la colección, devolviendo true si lo ha insertado y false si no ha podido.
      • hs.add(new Integer(1));
    • Como sabéis, las colecciones no admiten tipos primitivos, con lo que deberemos envolver el tipo con la clase específica.
    • object remove(int posicion): Elimina de la colección el objeto la posición indicada. no hay que hacerle conversión de tipo, ya que, como lo a a eliminar, no le hace falta saber de que tipo es.
      • hs.remove(0);
    • void clear(): Elimina todos los elementos almacenados en la colección.
      • hs.clear();
    • int Size(): Devuelve el tamaño de la colección. 
      • hs.size();
    • object clone(): Metodo que devuelve una copia del HashSet:
      • HashSet newHs =new HashSet();
      • newHs=(HashSet) hs.clone();
    • Aquí un ejemplo de como clonar un HashSet. Como veis, le hemos hecho la conversión a HashSet, ya que nos devuelve un objeto y tenemos que indicarle el tipo específico al que va a ser converso. 
    • boolean contains(object o): Método que devuelve true si la colección contiene el elemento pasado por parámetro.
      • hs.contains(new Integer(1));
    • boolean isEmpty(): Método que devuelve true si la colección esta vacía.
      • hs.isEmpty();
    • Iterator iterator(): Método que recorre los elementos de una colección.
    • Este tipo de colección no contiene un método get() para obtener los elementos de una colección, como List. En cambio, posee este método, el cual, combinado con un bucle while, nos permitirá ir recorriendo nuestra colección:
      • Iterator it=hs.iterator();
      • while(it.hasNext()){
      • System.out.println(it.next());
      • }
    • Bien, aquí lo que hacemos es, instanciar la interfaz Iterator, posteriormente utilizamos el método booleano "hasNext()" para indicarle al Iterator que mientras haya elementos en la colección siga recorriendola, y finalmente imprimimos por pantalla el elemento en el que este posicionado con el método "next()".
LinkedHashSet:

Esta colección es ordenada pero no clasificada, esto quiere decir que el orden de los elementos, es el mismo que el orden en el que se insertan. Ello conlleva una gran diferencia con HashSet, ya que esta no era ordenada. También hay que tener en cuenta que al ser ordenada tiene una iteración más lenta.

Su construcción sería:
              • LinkedHashSet lhs=new LinkedHashSet();
Esta colección utiliza los mismos métodos que la colección HashSet, con lo que no los voy a volver a repetir.


TreeSet:

Es una subclase clasifica, con lo cual los elementos serán ordenados siguiendo un orden natural, es decir, los números serán ordenados, las cadenas serán puestas en en orden alfabético, etc...La iteración de esta colección es más lenta que la anteriores.

Su construcción sería:
              • TreeSet ts=new TreeSet();
Esta colección posee los mismos métodos que HashSet, los cuales no voy a volver a escribir, pero, también posee otros métodos que no poseen las anteriores, los cuales son:
    • object last(): Método que devuelve el último elemento de la colección.
      • ts.last();
    • object higher(object o): Devuelve el elemento menor de la colección, pero que sea mayor que el elemento dado. Devuelve null si no existe el elemento dado.
      • ts.higher(new Integer(5));
    • Supongamos que en nuestra colección tenemos los números del 1 al 10. Si utilizamos la sentencia anterior nos dará como resultado el número que sea superior a 5 pero el menor de la colección, con lo cual nos dará 6, ya que si empezamos a contar desde 5, nos quedará del 6 al 10 y el menor de 6 a 10 es 6.
    • object lower(object o): Devuelve el elemento mayor de la colección, pero que sea menor que el elemento dado. Devuelve null si no existe el elemento dado.
      • ts.lower(new Integer (5));
    • Volviendo a nuestra colección del 1 al 10, si tenemos 5 tiene que elegir un número que sea menor que el elemento pasado, por lo tanto nos quedará del 4 al 1, y el elemento mayor de estos últimos es 4, así que ese sería el resultado.
    • Estos dos métodos son mucho más eficientes en el uso de cadenas.
    • Object pollFirst(): Elimina el primer elemento de la colección. Devuelve null si esta vacía.
      • ts.pollFirst():
    • object pollLast(): Elimina el último elemento de la colección. Devuelve null si esta vacía.
      • ts.pollLast();
Bien amigos, hay bastantes más métodos, pero estos últimos y con los del HashSet son los más utilizados. La iteración que realiza esta colección es la misma que la que realiza HashSet, (un Iterator y un while)

Bien, hasta aquí la Interfaz Set. Como veis la cosa empieza a complicarse, pues Java es un lenguaje muy robusto y es complicado conocer todos sus entresijos, aún así hay una cosa que nunca falla, estudiar, estudiar y estudiar. Así que nada, podéis echarle un vistazo a la API de java, ya que yo solo toco la superficie de las colecciones, lo suficiente para que podáis a empezar a manejarlas, pero insuficiente para un ojo experto, tampoco os quiero hacer un cacao mental. 

Un saludo.

No hay comentarios:

Publicar un comentario