from example hashmap rust lookup

example - hashmap java



¿Cómo buscar e insertar en un HashMap de manera eficiente? (1)

La API de entry está diseñada para esto. En forma manual, podría parecer

use std::collections::hash_map::Entry; let values: &Vec<isize> = match map.entry(key) { Entry::Occupied(o) => o.into_mut(), Entry::Vacant(v) => v.insert(default) };

O uno puede usar la forma más breve:

map.entry(key).or_insert_with(|| default)

Si el cálculo default es correcto / económico incluso cuando no está insertado, también puede ser:

map.entry(key).or_insert(default)

Me gustaría hacer lo siguiente:

  • Busque una Vec para una determinada clave y guárdela para usarla más tarde.
  • Si no existe, cree un Vec vacío para la clave, pero aún así manténgalo en la variable.

¿Cómo hacer esto de manera eficiente? Naturalmente pensé que podría usar match :

use std::collections::HashMap; // This code doesn''t compile. let mut map = HashMap::new(); let key = "foo"; let values: &Vec<isize> = match map.get(key) { Some(v) => v, None => { let default: Vec<isize> = Vec::new(); map.insert(key, default); &default } };

Cuando lo probé, me dio errores como:

error[E0502]: cannot borrow `map` as mutable because it is also borrowed as immutable --> src/main.rs:11:13 | 7 | let values: &Vec<isize> = match map.get(key) { | --- immutable borrow occurs here ... 11 | map.insert(key, default); | ^^^ mutable borrow occurs here ... 15 | } | - immutable borrow ends here

Terminé haciendo algo como esto, pero no me gusta el hecho de que realiza la búsqueda dos veces ( map.contains_key y map.get ):

// This code does compile. let mut map = HashMap::new(); let key = "foo"; if !map.contains_key(key) { let default: Vec<isize> = Vec::new(); map.insert(key, default); } let values: &Vec<isize> = match map.get(key) { Some(v) => v, None => { panic!("impossiburu!"); } };

¿Hay una manera segura de hacer esto con solo una match ?