Diccionarios: la clase HashMap

Imagina un diccionario inglés-español. Queremos saber qué significa la palabra “stiff”. Sabemos que en el diccionario hay muchas entradas y en cada entrada tenemos una palabra en inglés y su correspondiente traducción al español. Buscando por la “s” encontramos que “stiff” significa “agujetas”.

Un diccionario en Java funciona exactamente igual. Contiene una serie de elementos que son las entradas que a su vez están formadas por un par (clave, valor). La clave (key) permite acceder al valor. No puede haber claves duplicadas. En el ejemplo anterior, la clave sería “stiff” y el valor “agujetas”. Java dispone de varios tipos de diccionarios: HashMap, EnumMap, Hashtable, IdentityHashMap, LinkedHashMap, etc. Nosotros estudiaremos el diccionario HashMap.

Principales métodos de HashMap

Algunos de los métodos más importantes de la clase HasMap son:

get(clave)
Obtiene el valor correspondiente a una clave. Devuelve null si no existe esa clave en el diccionario.

put(clave, valor) 
Añade un par (clave, valor) al diccionario. Si ya había un valor para esa clave, se machaca.

keySet() 
Devuelve un conjunto (set) con todas las claves.

values() 
Devuelve una colección con todos los valores (los valores pueden estar duplicados a diferencia de las claves).
entrySet() 
Devuelve una colección con todos los pares (clave, valor).

containsKey(clave) Devuelve true si el diccionario contiene la clave indicada y false en caso contrario.

getKey() Devuelve la clave de la entrada. Se aplica a una sola entrada del diccionario (no al diccionario completo), es decir a una pareja (clave, valor).

Por ejemplo:

for (Map.Entry pareja: m.entrySet()) {    System.out.println(pareja.getKey());
}


getValue()Devuelve el contenido de la entrada. Se aplica a una entrada del diccionario (no al diccionario completo), es decir a una pareja (clave, valor).
Por ejemplo:
for (Map.Entry pareja: m.entrySet()) {System.out.println(pareja.getValue());
}


Definición de un HasMap e inserción, borrado y modificación de entradas  

Al declarar un diccionario hay que indicar los tipos tanto de la clave como del valor. En el siguiente ejemplo definimos el diccionario m que tendrá como clave un número entero y una cadena de caracteres como valor. Este diccionario se declara de esta forma:

HashMap<Integer, String> m = new HashMap<Integer, String>();

No hay que olvidar importar la clase al principio del programa:

import java.util.HashMap;
Para insertar una entrada en el diccionario se utiliza el método put indicando siempre la clave y el valor. Veamos un ejemplo completo.
 

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
import java.util.HashMap;
public class EjemploHashMap01 {
 public static void main(String[] args) {
  HashMap<Integer, String> m = new HashMap<Integer, String>();
  m.put(924, "Amalia Núñez");
  m.put(921, "Cindy Nero");
  m.put(700, "César Vázquez");
  m.put(219, "Víctor Tilla");
  m.put(537, "Alan Brito");
  m.put(605, "Esteban Quito ");
  System.out.println("Los elementos de m son: \n" + m);
 }
}

Para extraer valores se utiliza el método get. Se proporciona una clave y el diccionario nos devuelve el valor, igual que un diccionario de verdad. Si no existe ninguna entrada con la clave que se indica, se devuelve null.


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
public class EjemploHashMap011 {
 public static void main(String[] args) {
  HashMap<Integer, String> m = new HashMap<Integer, String>();
  m.put(924, "Amalia Núñez");
  m.put(921, "Cindy Nero");
  m.put(700, "César Vázquez");
  m.put(219, "Víctor Tilla");
  m.put(537, "Alan Brito");
  m.put(605, "Esteban Quito ");
  System.out.println(m.get(921));
  System.out.println(m.get(605));
  System.out.println(m.get(888));
 }
}
¿Y si queremos extraer todas las entradas? Tenemos varias opciones. Podemos usar el método print directamente sobre el diccionario de la forma System.out.print(diccionario) como vimos en un ejemplo anterior; de esta manera se muestran por pantalla todas las entradas encerradas entre llaves. También podemos convertir el diccionario en un entrySet (conjunto de entradas) y mostrarlo con print; de esta forma se obtiene una salida por pantalla muy parecida a la primera (en lugar de llaves se muestran corchetes). Otra opción es utilizar un for para recorrer una a una todas las entradas. En este último caso hay que convertir el diccionario en un entrySet ya que no se pueden sacar las entradas directamente del diccionario. Estas dos últimas opciones se ilustran en el siguiente ejemplo.


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
import java.util.HashMap;
import java.util.Map;
public class EjemploHashMap02 {
 public static void main(String[] args) {
  HashMap<Integer, String> m = new HashMap<Integer, String>();
  m.put(924, "Amalia Núñez");
  m.put(921, "Cindy Nero");
  m.put(700, "César Vázquez");
  m.put(219, "Víctor Tilla");
  m.put(537, "Alan Brito");
  m.put(605, "Esteban Quito ");
  System.out.println("Todas las entradas del diccionario extraídas con entrySet:");
  System.out.println(m.entrySet());
  System.out.println("\nEntradas del diccionario extraídas una a una:");
  for (Map.Entry pareja: m.entrySet()) {
   System.out.println(pareja);
  }
 }
}
A continuación se muestra el uso de los métodos getKey y getValue que extraen la clave y el valor de una entrada respectivamente.



 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
import java.util.*;
public class EjemploHashMap03 {
 public static void main(String[] args) {
  HashMap<Integer, String> m = new HashMap<Integer, String>();
  m.put(924, "Amalia Núñez");
  m.put(921, "Cindy Nero");
  m.put(700, "César Vázquez");
  m.put(219, "Víctor Tilla");
  m.put(537, "Alan Brito");
  m.put(605, "Esteban Quito ");
  System.out.println("Código\tNombre\n------\t-------------");
  for (Map.Entry pareja: m.entrySet()) {
   System.out.print(pareja.getKey() + "\t");
   System.out.println(pareja.getValue());
  }
 }
}

En el último programa de ejemplo hacemos uso del método containsKey que nos servirá para saber si existe o no una determinada clave en un diccionario y del método get que, como ya hemos visto, sirve para extraer un valor a partir de su clave.


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
import java.util.*;
public class EjemploHashMap04 {
 public static void main(String[] args) {
  HashMap<Integer, String> m = new HashMap<Integer, String>();
  m.put(924, "Amalia Núñez");
  m.put(921, "Cindy Nero");
  m.put(700, "César Vázquez");
  m.put(219, "Víctor Tilla");
  m.put(537, "Alan Brito");
  m.put(605, "Esteban Quito ");
  System.out.print("Por favor, introduzca un código: ");
  int codigoIntroducido = Integer.parseInt(System.console().readLine());
  if (m.containsKey(codigoIntroducido)) {
   System.out.print("El código " + codigoIntroducido + " corresponde a ");
   System.out.println(m.get(codigoIntroducido));
  } else {
   System.out.print("El código introducido no existe.");
  }
 }
}

Compartir

0 Comment to "Diccionarios: la clase HashMap"

Publicar un comentario