viernes, 11 de enero de 2013

Colecciones: Interfaz Map

Buenas amigos, en este nuevo tema, vamos a ver un poco mas detalladamente la interfaz Map como hicimos con otras colecciones como List y Set.

La peculiaridad de esta interfaz, es que, junto al elemento que se inserta debemos insertar también una clave.  Nos proporciona, al igual que List y Set una serie de métodos que nos permitirán:


    • Añadir un elemento
    • Eliminar un elemento
    • Obtener un elemento
    • Localizar un elemento
    • Iterar sobre la colección

Esta interfaz implementa múltiples clases, pero las que más nos interesa son las 4 que vamos a ver a continuación::

HashMap:

Clase que implementa la interfaz Map, permite claves con valor "null" y elementos con valor "null". No es ni ordenada ni clasificada, y no ofrece ninguna garantía en cuanto al que el orden permanezca constante.

Su creación es de la siguiente manera:
                • HashMap hm=new HashMap();

Una cosa que no he comentado en temas anteriores, es que las colecciones tienen varios constructores, yo  no los pongo, ya que no quiero hacer cacaos mentales, pero podéis ir a la API de java y profundizar más sobre ellas.

Los métodos más usados son: 
    • void clear(): Método que remueve todos los elementos de la colección.
      • hm.clear();
    • object clone(): Método que devuelve una copia superficial de la colección. Las claves y los elementos no se copian.
      • Hashmap hm2=hm.clone();
    • object put(object key, object value): Método que inserta en la colección los elementos (values) y la clave de ese elemento(key).
      • hm.put(1,"Juan");
      • Introducimos una clave numérica, podríamos elegir como clave cualquier objeto.
    • boolean containsKey(object key): Método que devuelve true si existe la clave en la colección.
      • hm.containsKey(1);
    • object get(object key): Método que devuelve el valor del elemento asociado a la clave, o null si no existe la clave.
      • hm.get(1);
    • boolean isEmpty(): Método que devuelve true si la colección está vacía.
      • hm.isEmpty();
    • object remove(object key): Método que elimina la clave, y el elemento asociado a esta, que es pasada como argumento.
      • hm.remove(1);
    • int size(): Método que devuelve el número de elementos que hay en la colección.
      • int x=hm.size();
    • Set entrySet(): Método que devuelve una vista de conjunto de  los elementos del mapa.
      • hm.entrySet();
Con este último método ya podemos iterar sobre la colección de esta manera:
    • Iterator it=hm.entrySet().iterator();
    • while(it.hasNext()){
    • Map.Entry me=(Map.Entry) it.next();
    • System.out.println(me.getKey()+"-"+me.getValues());
    • }
Otra forma de hacerlo sería:
    • for(int i=0;i<hm.size();i++){
    • System.out.println(hm.get(i+1));
    • }
Podéis elegir la que más os plazca, a mi personalmente, y me podéis llamar incrédulo, me gusta más la primera forma.

Existen algunos métodos más, pero con conocer estos nos sobra.

Hashtable:

Esta clase es exactamente igual que la anterior salvo que no admite valores "null" y sus métodos son Synchronized.

Su construcción sería:
              • Hashtable ht=new Hashtable();
Los métodos que utiliza son los mismos que HashMap, y la iteración también es la misma, así que no los volvemos a repetir.

LinkedHashMap:

Clase ordenada según el orden de inserción, La mayor diferencia entre HashMap y LinkedHashMap, es que esta última mantiene una lista doble enlazada con el fin de conseguir una iteración predecible.

Su construcción sería: 
              • LinkedHashMap lhm=new LinkedHashMap();

Los métodos que utiliza son básicamente los mismos que HashMap, menos un par que son exclusivos de esta colección, pero que tampoco son muy frecuentes de utilizar. Así pues, seguiremos utilizando los métodos e iteración de HashMap.

TreeMap:

Esta clase es ordenada y clasificada. Se ordena por el orden natural de sus claves. Tiene una iteración más lenta, pero al mismo tiempo más fiable.

Su construcción es:
              • TreeMap tm=new TreeMap();


Utiliza los mismos métodos que HashMap, y algunos, muy interesantes también, propios.
    • object ceilingKey(): Método que devuelve la clave igual o mayor a la pasada como argumento.
      • tm.ceilingKey(1);
    • object firstkey(): Método que devuelve la primera clave de la colección.
      • tm.firstKey();
    • object lastKey(): Método que devuelve la última clave de la colección.
      • tm.lastKey();
    • object lowerKey(object key): Método que devuelve la clave superior estrictamente inferior a la clave pasada por argumentos.
      • tm.lowerKey(3);
    • object higherKey(object key): Método que devuelve la clave inferior estrictamente superior a la clave pasada por argumentos.
      • tm.higherKey(3);
Hay bastantes más, pero para cubrir las necesidades básicas, nos sobra. La iteración es igual a la que hace HashMap.

Una última cosa que me gustaría agregar, es que las colecciones están incompletas, ya que, para un uso mucho más correcto debemos implantar los genéricos, que serán explicados en el siguiente tema, y aunque explicado como yo lo he hecho, el código compilaría, siempre lo haría con avisos. Así que no se preocupen, en el próximo tema veremos los genéricos, que son muy sencillos de entender y muy útiles.

Un saludo


No hay comentarios:

Publicar un comentario