CodeGym /Cursos /JAVA 25 SELF /«Tu propio diccionario» — ...

«Tu propio diccionario» — HashMap<K,V>

JAVA 25 SELF
Nivel 12, Lección 2
Disponible

1. Introducción

Ya sabemos que ArrayList es un «array infinito» que crece por sí solo. Pero tiene una limitación: el acceso a los elementos se hace por número (índice). Si tenemos una lista de mil personas y queremos encontrar el teléfono de Alicia, habrá que conocer su índice o recorrer a todos uno por uno.

En la vida real solemos buscar datos por un identificador único:

  • por nombre buscamos el número de teléfono,
  • por número de pasaporte buscamos al titular,
  • por login encontramos la contraseña,
  • por id buscamos un objeto en la base de datos.

Para eso necesitamos una estructura que sepa: «recibe una clave → encuentra el valor al instante». En Java de esto se encarga HashMap<K,V>.

Analogía:
Imagina un diccionario de papel. Buscas la traducción de la palabra «house». No necesitas hojear todas las páginas. Vas directamente a la letra «H» y encuentras la palabra que necesitas. Así funciona HashMap: por la clave (la palabra) obtenemos al instante el valor (la traducción).

Crear un diccionario

Para crear un diccionario, hay que indicar qué tipos serán las claves y cuáles serán los valores.

import java.util.HashMap;

HashMap<String, String> phonebook = new HashMap<String, String>();

Aquí:

  • String (primer tipo) es el tipo de la clave (nombre de la persona).
  • String (segundo tipo) es el tipo del valor (número de teléfono).

Ahora phonebook es como una agenda telefónica de verdad.

Otros ejemplos:

HashMap<String, Integer> grades = new HashMap<String, Integer>();  // nombre → nota
HashMap<Integer, String> users = new HashMap<Integer, String>();   // id → nombre
HashMap<String, Boolean> flags = new HashMap<String, Boolean>();   // clave → valor booleano

A diferencia de ArrayList, el diccionario no tiene el método add(), pero sí los suyos, no menos interesantes.

2. Método put(key, value) — añadir un par

La principal diferencia de HashMap respecto a los arrays y las listas es que no almacena solo un conjunto de valores, sino pares clave–valor. Esto lo hace similar a un diccionario real: cada palabra tiene su traducción, cada nombre — su teléfono, cada login — su contraseña.

Ejemplo:

phonebook.put("Alicia", "+380501112233");
phonebook.put("Bob", "+380671234567");

Ahora, en nuestra agenda telefónica:

  • la clave "Alicia" está asociada al valor "+10501112233",
  • la clave "Bob" está asociada al valor "+10671234567".

Esto significa que, para obtener el valor (el teléfono), basta con conocer la clave (el nombre).

Importante: las claves son únicas. Si intentamos añadir un nuevo valor para una clave ya existente, el valor anterior se sobrescribirá.

phonebook.put("Alicia", "+10999999999");

Ahora Alicia se ha quedado solo con el número nuevo: el número antiguo se ha perdido.

Conclusión: put es el método para añadir o actualizar entradas. Si la clave es nueva, se crea la entrada. Si la clave ya existe, se actualiza.

3. Método get(key) — obtener un valor

Para encontrar un valor, hay que conocer la clave. Esta es la gran ventaja de HashMap: la búsqueda por clave funciona muy rápido, prácticamente al instante, da igual si tenemos mil entradas o un millón.

Ejemplo:

System.out.println(phonebook.get("Alicia"));

Salida:

+10501112233

Si esa clave no existe, get devolverá null:

System.out.println(phonebook.get("Charlie")); // null

Esto significa: «no existe la clave "Charlie" en el diccionario».

4. Método containsKey(key) — comprobar existencia

Para no toparnos con null, conviene comprobar primero si la clave existe en el diccionario.

Ejemplo:

System.out.println(phonebook.containsKey("Charlie"));

Salida:

false

Así podemos saber de antemano:

  • si la clave no existe — creamos una nueva entrada,
  • si la clave existe — la actualizamos.

Patrón habitual:

if (phonebook.containsKey("Alicia")) 
{
    System.out.println("¡Alicia ya tiene número!");
} 
else 
{
    phonebook.put("Alicia", "+10111111111");
}

5. Método remove(key) — eliminar una entrada

Eliminar es igual de sencillo: solo hace falta conocer la clave.

phonebook.remove("Bob");
System.out.println(phonebook.get("Bob"));

Salida:

null

Ahora ya no existe la entrada con la clave "Bob" en el diccionario.

6. Recorrido de todos los pares

A menudo hace falta no solo obtener datos por una clave concreta, sino también mostrar todo el diccionario. Para ello se usa el método entrySet().

for (var entry : phonebook.entrySet()) {
    System.out.println(entry.getKey() + " -> " + entry.getValue());
}

Ejemplo de salida:

Alicia -> +10501112233

De este modo, obtenemos acceso tanto a la clave (entry.getKey()) como al valor (entry.getValue()).

7. Práctica: conteo de palabras

Veamos una tarea clásica: contar cuántas veces se repiten las palabras en un texto. Este es uno de los ejemplos más claros de para qué sirve HashMap.

String text = "java java core java";
HashMap<String, Integer> freq = new HashMap<String, Integer>();

for (String w : text.split(" ")) 
{
    Integer old = freq.get(w);
    freq.put(w, (old == null) ? 1 : old + 1);
}

System.out.println(freq);

Salida:

{core=1, java=3}

Veamos en detalle lo que ocurre aquí:

  1. Dividimos la cadena "java java core java" en palabras.
  2. Para cada palabra miramos si ya está en el diccionario (freq.get(w)).
  3. Si no está (null), significa que es la primera aparición de la palabra → guardamos 1.
  4. Si está, significa que la palabra ya ha aparecido → incrementamos el valor en uno.

Usos reales:

  • recuento del número de llamadas al API,
  • estadísticas de frecuencia de palabras en un texto,
  • almacenamiento de la cantidad de productos en stock.

8. Práctica: agenda telefónica

Escribamos una aplicación un poco más grande.

import java.util.HashMap;
import java.util.Scanner;

public class PhonebookApp {
    public static void main(String[] args) 
    {
        HashMap<String, String> phonebook = new HashMap<String, String>();
        Scanner console = new Scanner(System.in);

        while (true) 
        {
            System.out.print("Introduzca un nombre (o una línea vacía para salir): ");
            String name = console.nextLine();
            if (name.isEmpty()) break;

            System.out.print("Introduzca el número: ");
            String phone = console.nextLine();

            phonebook.put(name, phone);
        }

        System.out.println("Agenda telefónica:");
        for (var entry : phonebook.entrySet()) 
        {
            System.out.println(entry.getKey() + " -> " + entry.getValue());
        }
    }
}

El programa funciona como un mini-directorio. Introduces nombres y teléfonos, y se guardan en HashMap. Al final puedes mostrar la lista completa. Los diccionarios se utilizan muy a menudo en proyectos reales.

1
Tarea
JAVA 25 SELF, nivel 12, lección 2
Bloqueada
Añadir y obtener un valor
Añadir y obtener un valor
1
Tarea
JAVA 25 SELF, nivel 12, lección 2
Bloqueada
Comprobación de la existencia de una clave
Comprobación de la existencia de una clave
1
Tarea
JAVA 25 SELF, nivel 12, lección 2
Bloqueada
Eliminación de un elemento del diccionario
Eliminación de un elemento del diccionario
1
Tarea
JAVA 25 SELF, nivel 12, lección 2
Bloqueada
Conteo de palabras en el texto
Conteo de palabras en el texto
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION