Pular para o conteúdo principal

Maps e Dicionários

Maps (também conhecidos como dicionários, hash maps ou arrays associativos) armazenam pares chave-valor. Veja como diferentes linguagens os manipulam.

Criando e Acessando Maps​

// 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");

Principais Conclusões​

  • Suporte a sintaxe nativa -- JavaScript, Python, Ruby, Go e Swift possuem sintaxe dedicada para literais de map/dict (ex.: {"name": "John"} em Python, map[string]string{"name": "John"} em Go). C não possui hash map nativo e requer bibliotecas como uthash ou implementação manual. A sintaxe literal melhora a legibilidade e reduz código repetitivo. Se você trabalha intensamente com dados chave-valor (configuração, caches, JSON), escolha uma linguagem com suporte nativo a maps; para C, planeje integrar uma biblioteca desde o início.

  • Ordenado vs não ordenado -- Dicts do Python (3.7+), arrays do PHP e Map do JavaScript preservam a ordem de inserção. O HashMap do Rust é não ordenado; use BTreeMap para iteração ordenada por chave. Maps do Go são não ordenados; o HashMap do Java é não ordenado (use LinkedHashMap para ordem de inserção). A ordem importa para saída reproduzível, caches LRU ou quando a ordem carrega significado. Prefira Python, PHP ou Map do JavaScript quando a ordem for importante; BTreeMap do Rust quando precisar de chaves ordenadas.

  • Padrões de acesso seguro -- O value, ok := m["key"] do Go retorna um booleano para existência; o subscript opcional do Swift (dict["key"]) retorna nil para chaves ausentes; o dict.get("key", default) do Python e o hash.fetch(:key, default) do Ruby evitam exceções. A indexação direta no Rust (map["key"]) causa panic se a chave estiver ausente; em C++ map["key"] cria uma entrada com valor padrão. Use acesso seguro quando as chaves podem estar ausentes (ex.: entrada do usuário, configuração opcional); indexação direta quando as chaves são garantidas.

  • Tipos de chave e valor -- Objetos simples do JavaScript suportam apenas chaves string; Map permite qualquer tipo, incluindo objetos. Dicts do Python exigem chaves hashable (ex.: strings, números, tuplas). Maps do Go exigem chaves comparáveis. O HashMap do Rust precisa de chaves que implementem Hash e Eq. Escolha Map em JavaScript quando precisar de chaves não-string; em Rust, considere BTreeMap para tipos de chave personalizados que não implementam Hash adequadamente.

  • Segurança em threads e concorrência -- O ConcurrentHashMap do Java e o ConcurrentDictionary do C# são construídos para acesso concorrente. Maps do Go não são seguros para escritas concorrentes; use sync.Map ou mutexes. O modelo de ownership do Rust previne data races sem um tipo separado de map concorrente. Para estado mutável compartilhado entre threads, prefira Java ou C#; em Go, envolva maps com mutexes ou use sync.Map; em Rust, use channels ou Arc<Mutex<HashMap>>.