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 Dart es Map<K, V>; el literal es {'Ana': 25} y conserva el orden de inserción.

Crear, consultar, modificar y borrar

void main() {
  final edades = {'Ana': 25, 'Luis': 30};
  print('edad de Ana: ${edades['Ana']}');
  print('Pepe: ${edades['Pepe'] ?? 'no está'}');
  print('Pepe con valor por defecto: ${edades['Pepe'] ?? 0}');

  edades['Eva'] = 22; // añadir
  edades['Ana'] = 26; // modificar
  for (final entrada in edades.entries) {
    print('${entrada.key} -> ${entrada.value}');
  }
  edades.remove('Luis');
  print('tras borrar a Luis quedan ${edades.length}');

  final cuentas = <String, int>{};
  for (final palabra in 'a b a c b a'.split(' ')) {
    cuentas[palabra] = (cuentas[palabra] ?? 0) + 1;
  }
  print('frecuencias:');
  cuentas.forEach((clave, valor) => print('$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 Dart
Consultar (null si no está) edades['Ana']
Valor por defecto edades['Pepe'] ?? 0
Añadir o modificar edades['Eva'] = 22
¿Existe la clave? edades.containsKey('Ana')
Borrar edades.remove('Luis')
Tamaño edades.length
Solo claves · solo valores edades.keys · edades.values
Recorrer pares for (final e in edades.entries) → e.key, e.value

Consultar una clave que no existe

Consultar una clave que no existe no falla: devuelve null. Por eso edades['Ana'] tiene tipo int? y, si vas a operar con él, hay que decidir qué hacer con el null (?? 0, !, un if).

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

void main() {
  final notas = {
    'Ana': [7, 9],
    'Luis': [5, 6, 7],
  };
  print('claves: ${notas.keys.join(', ')}');
  for (final entrada in notas.entries) {
    final lista = entrada.value;
    var suma = 0;
    for (final n in lista) {
      suma += n;
    }
    print('${entrada.key}: media ${suma / lista.length}');
  }
  print('total de notas: ${notas.values.expand((lista) => lista).length}');
}

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.