Saltar al contenido principal

Mapas y Diccionarios

Los mapas (también conocidos como diccionarios, mapas hash o arreglos asociativos) almacenan pares clave-valor. Así es como los manejan los diferentes lenguajes.

Creación y Acceso a Mapas​

// Object (string keys only)
const obj = { name: "John", age: 30 };
obj.name; // "John"
obj["age"]; // 30

// Map (any key type)
const map = new Map();
map.set("key", "value");
map.set(42, "number key");
map.set(obj, "object key");

map.get("key"); // "value"
map.has("key"); // true
map.size; // 3
map.delete("key");

// Initialize Map
const map2 = new Map([
["a", 1], ["b", 2], ["c", 3]
]);

// WeakMap (keys are garbage collected)
const weakMap = new WeakMap();
weakMap.set(obj, "data");

Puntos Clave​

  • Soporte de sintaxis incorporada -- JavaScript, Python, Ruby, Go y Swift tienen sintaxis literal dedicada para mapas/diccionarios (por ejemplo, {"name": "John"} en Python, map[string]string{"name": "John"} en Go). C no tiene mapa hash incorporado y requiere bibliotecas como uthash o implementación manual. La sintaxis literal mejora la legibilidad y reduce el código repetitivo. Si trabajas frecuentemente con datos clave-valor (configuración, cachés, JSON), elige un lenguaje con soporte de mapas de primera clase; para C, planea integrar una biblioteca desde el inicio.

  • Ordenado vs no ordenado -- Los diccionarios de Python (3.7+), los arreglos de PHP y el Map de JavaScript preservan el orden de inserción. El HashMap de Rust no está ordenado; usa BTreeMap para iteración ordenada por clave. Los mapas de Go no están ordenados; el HashMap de Java no está ordenado (usa LinkedHashMap para orden de inserción). El orden importa para salida reproducible, cachés LRU o cuando el orden codifica significado. Prefiere Python, PHP o Map de JavaScript cuando el orden es importante; BTreeMap de Rust cuando necesitas claves ordenadas.

  • Patrones de acceso seguro -- El value, ok := m["key"] de Go retorna un booleano de existencia; el subíndice opcional de Swift (dict["key"]) retorna nil para claves faltantes; el dict.get("key", default) de Python y el hash.fetch(:key, default) de Ruby evitan excepciones. El acceso directo por índice en Rust (map["key"]) causa panic si la clave falta; en C++ map["key"] crea una entrada con un valor por defecto. Usa acceso seguro cuando las claves pueden estar ausentes (por ejemplo, entrada de usuario, configuración opcional); acceso directo cuando las claves están garantizadas.

  • Tipos de clave y valor -- Los objetos planos de JavaScript solo soportan claves de tipo string; Map permite cualquier tipo incluyendo objetos. Los diccionarios de Python requieren claves hashables (por ejemplo, strings, números, tuplas). Los mapas de Go requieren claves comparables. El HashMap de Rust necesita claves que implementen Hash y Eq. Elige Map en JavaScript cuando necesites claves que no sean strings; en Rust, considera BTreeMap para tipos de clave personalizados que no implementen bien Hash.

  • Seguridad en hilos y concurrencia -- El ConcurrentHashMap de Java y el ConcurrentDictionary de C# están diseñados para acceso concurrente. Los mapas de Go no son seguros para escrituras concurrentes; usa sync.Map o mutexes. El modelo de propiedad de Rust previene carreras de datos sin un tipo de mapa concurrente separado. Para estado mutable compartido entre hilos, prefiere Java o C#; en Go, envuelve los mapas con mutexes o usa sync.Map; en Rust, usa canales o Arc<Mutex<HashMap>>.