Saltar a contenido

3.2 Mapas (diccionarios)

Un mapa (o diccionario) guarda pares clave → valor. En lugar de buscar por posición, como en una lista, se busca por clave: dado un nombre, su edad; dada una palabra, cuántas veces aparece. Las claves son únicas: si asignas otra vez la misma clave, se sobrescribe el valor.

En Java es Map<K, V> y hay que elegir una implementación: HashMap (rápida, sin orden garantizado), LinkedHashMap (recuerda el orden de inserción, como en el ejemplo) o TreeMap (ordenada por clave). Si imprimes un HashMap el orden puede sorprenderte.

Crear, consultar, modificar y borrar

import java.util.LinkedHashMap;
import java.util.Map;

public class Map1 {
    public static void main(String[] args) {
        Map<String, Integer> edades = new LinkedHashMap<>();
        edades.put("Ana", 25);
        edades.put("Luis", 30);
        System.out.println("edad de Ana: " + edades.get("Ana"));
        System.out.println("Pepe: " + (edades.containsKey("Pepe") ? edades.get("Pepe") : "no está"));
        System.out.println("Pepe con valor por defecto: " + edades.getOrDefault("Pepe", 0));

        edades.put("Eva", 22); // añadir
        edades.put("Ana", 26); // modificar
        for (Map.Entry<String, Integer> entrada : edades.entrySet()) {
            System.out.println(entrada.getKey() + " -> " + entrada.getValue());
        }
        edades.remove("Luis");
        System.out.println("tras borrar a Luis quedan " + edades.size());

        Map<String, Integer> cuentas = new LinkedHashMap<>();
        for (String palabra : "a b a c b a".split(" ")) {
            cuentas.merge(palabra, 1, Integer::sum);
        }
        System.out.println("frecuencias:");
        cuentas.forEach((clave, valor) -> System.out.println(clave + " -> " + valor));
    }
}

Salida:

edad de Ana: 25
Pepe: no está
Pepe con valor por defecto: 0
Ana -> 26
Luis -> 30
Eva -> 22
tras borrar a Luis quedan 2
frecuencias:
a -> 3
b -> 2
c -> 1
Operación En Java
Consultar (null si no está) edades.get("Ana")
Valor por defecto edades.getOrDefault("Pepe", 0)
Añadir o modificar edades.put("Eva", 22)
¿Existe la clave? edades.containsKey("Ana")
Borrar edades.remove("Luis")
Tamaño edades.size()
Solo claves · solo valores edades.keySet() · edades.values()
Recorrer pares for (Map.Entry<K, V> e : edades.entrySet()) → getKey(), getValue()

Consultar una clave que no existe

Consultar una clave que no existe no falla: get devuelve null, y si lo usas sin comprobar, tendrás un NullPointerException más adelante. Usa containsKey o getOrDefault.

Contar con un mapa

La segunda mitad del ejemplo es un patrón que se usa constantemente: contar cuántas veces aparece cada elemento. Para cada palabra, se lee su cuenta actual (o 0 si es la primera vez), se suma 1 y se guarda de nuevo.

Claves, valores y mapas de listas

import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

public class Map2 {
    public static void main(String[] args) {
        Map<String, List<Integer>> notas = new LinkedHashMap<>();
        notas.put("Ana", List.of(7, 9));
        notas.put("Luis", List.of(5, 6, 7));

        System.out.println("claves: " + String.join(", ", notas.keySet()));
        for (Map.Entry<String, List<Integer>> entrada : notas.entrySet()) {
            List<Integer> lista = entrada.getValue();
            int suma = 0;
            for (int n : lista) {
                suma += n;
            }
            System.out.println(entrada.getKey() + ": media " + (double) suma / lista.size());
        }
        System.out.println("total de notas: " + notas.values().stream().mapToInt(List::size).sum());
    }
}

Salida:

claves: Ana, Luis
Ana: media 8.0
Luis: media 6.0
total de notas: 5

Los valores pueden ser de cualquier tipo, incluidas listas u otros mapas. Aquí cada alumno tiene una lista de notas; se recorre el mapa y, para cada par, se recorre su lista.

¿Mapa, lista o conjunto?

Necesito... Estructura
Datos ordenados a los que accedo por posición Lista
Buscar un dato a partir de otro (nombre → edad) Mapa
Saber si algo está, sin repeticiones Conjunto

Errores frecuentes

Error Cómo evitarlo
Usar el valor de una clave que no existe Comprueba, o usa el valor por defecto
Esperar un orden concreto Usa una versión ordenada si el orden importa
Modificar el mapa mientras lo recorres Recorre una copia de las claves o construye un mapa nuevo
Repetir una clave pensando que añade otra entrada Las claves son únicas: la segunda sobrescribe

Para practicar

Haz los ejercicios 3.2 de mapas. Y para ver cómo se escribe en otro lenguaje: Pasar de uno a otro.