Feeds:
Entradas
Comentarios

Posts Tagged ‘hashmap’

Uno de los tipos de datos que más he utilizado siempre ha sido el HashMap de Java. Y es que este tipo nos ofrece numerosos métodos entre los que destacan, evidentemente, get(Object) y put(Object).

Leemos en wikipedia que una tabla hash es una estructura de datos en la que se asocian llaves o claves de valores a los valores propiamente dichos.

En lo práctico, si tiramos de documentación de la Java 1.6, vemos que un HashMap es un tipo de dato que implementa la interfaz de java.util.Map. Alguno de los métodos que implementa son:

  • get: devuelve el valor cuya llave se ha especificado como parámetro o «nulo» si la estrutura no contiene valor para la clave definida.
  • put: asocia valor específico con una clave en dicho mapa (HashMap). Si el mapa previamente ya contenía un valor para dicha llave, el valor será reemplazado.

Esto es básicamente lo que podemos hacer un HashMap.
En la ordenación de los datos se utiliza una función hash. Esta función devuelve una posición en la que se almacenará el dato:

Funcion_hash(valor) = posicion

Esta función deberá de cumplir necesariamente que para dos diferentes valores devolverá siempre posiciones diferentes.
Un ejemplo de función hash es la siguiente:

hash(i) = i mod S usando el 0 como el primer índice de la tabla hash de tamaño S.

Ahora bien, en numerosas ocasiones solemos utilizar esta estructura para almacenar un conjunto de datos de manera aleatoria pero posteriormente necesitaremos recogerlos de forma que podamos seguir manipulándolos para el fin que tengamos definido. Y son numerosas, aunque parezca mentira, las ocasiones que hemos almacenado elementos pero cuando vamos a recogerlos no sabemos exactamente qué tenemos en ese HashMap.

Una forma de recoger todos los elementos del mapa es crear un iterador que recorra la estructura y nos devuelva el contenido independientemente de la posición que ocupan, algo así:


HashMap hm = new HashMap();
hm.put("a","1");
hm.put("b","2");
hm.put("c","4");
hm.put("d","3");

Iterator it = hm.entrySet().iterator();

while (it.hasNext()) {
Map.Entry e = (Map.Entry)it.next();
System.out.println(e.getKey() + " " + e.getValue());
}

En este ejemplo, hemos:

  1. definido una estructura HashMap y la hemos llenado con las claves-valor utilizando el método put comentado en párrafos anteriores.
  2. Después, con el uso de un iterador hemos recorrido la estructura mostrando en la consola los pares clave-valor.

En mi consola, ejecutar esta porción de código equivale a la siguiente salida:

d 3
a 1
c 4
b 2

Puedes ver como el orden de la salida no se corresponde con el orden de entrada de los elementos. Esto es debido a que el objeto HashMap no es capaz de almacenar el orden en el que se han ido almacenando sus elementos. HashMap no es para eso. Si para nosotros es importante el orden deberemos de utilizar otro tipo de objetos que hereden de, por ejemplo, java.util.List o alguna estructura de tipo árbol que haga el trabajo por nosotros como las de la familia de java.util.TreeSet

Read Full Post »