HashMap::remove în Rust

Scoate o cheie din dicționar și returnează valoarea ei în Some; None dacă cheia nu exista.

Sintaxă
pub fn remove<Q>(&mut self, k: &Q) -> Option<V>
where K: Borrow<Q>, Q: Hash + Eq + ?Sized

Ce face HashMap::remove

remove(&cheie) șterge perechea și îți dă înapoi valoarea, mutată (nu o copie), deci o poți folosi mai departe. Dacă cheia nu există, returnează None și nu se întâmplă nimic.

remove_entry returnează și cheia: Some((cheie, valoare)). Pentru a șterge mai multe chei după o condiție, folosește retain; pentru a goli tot dicționarul, clear sau drain.

Parametri

Parametru Descriere
k Referință la cheia de șters.

Ce returnează

Some(valoare) dacă cheia exista, altfel None.

Exemple

Exemplul 1: Produse scoase din coș

use std::collections::HashMap;

fn main() {
    let mut cos = HashMap::from([("mere", 3), ("lapte", 2), ("pâine", 1)]);
    println!("{:?}", cos.remove("lapte"));
    println!("{:?}", cos.remove("lapte"));
    println!("mai sunt {} produse", cos.len());

    if let Some((cheie, cantitate)) = cos.remove_entry("mere") {
        println!("am scos {cheie} x{cantitate}");
    }
    println!("{:?}", cos);
}

Rezultat

Some(2)
None
mai sunt 2 produse
am scos mere x3
{"pâine": 1}

Exemplul 2: Valoarea scoasă se folosește mai departe

Primim String-ul comenzii, nu o copie, așa că îl putem muta în lista de livrate.

use std::collections::HashMap;

fn main() {
    let mut in_asteptare: HashMap<u32, String> = HashMap::new();
    in_asteptare.insert(101, String::from("2 pizza"));
    in_asteptare.insert(102, String::from("1 supă"));

    let mut livrate = Vec::new();
    for id in [101, 105] {
        match in_asteptare.remove(&id) {
            Some(comanda) => livrate.push(comanda),
            None => println!("comanda {id} nu există"),
        }
    }
    println!("livrate: {:?}, rămase: {}", livrate, in_asteptare.len());
}

Rezultat

comanda 105 nu există
livrate: ["2 pizza"], rămase: 1

Greșeli frecvente

  • Dai cheia prin valoare pentru chei numerice: m.remove(101) dă expected `&_`, found integer. Scrie m.remove(&101).
  • Ștergi chei într-o buclă for (k, _) in &m { m.remove(k); }: nu compilează (dicționarul e împrumutat de buclă). Folosește retain.

Comenzi înrudite

  • HashMap::insert: Pune o pereche cheie-valoare în dicționar; dacă cheia exista, înlocuiește valoarea și o returnează pe cea veche.
  • HashMap::retain: Păstrează doar perechile pentru care funcția dată returnează true; restul sunt șterse dintr-o singură trecere.
  • HashMap::drain: Golește dicționarul și dă toate perechile ca iterator, prin valoare; dicționarul rămâne gol, dar utilizabil.
  • HashMap::len: len spune câte perechi cheie-valoare are dicționarul, is_empty dacă nu are niciuna, iar clear le șterge pe toate.
  • BTreeMap: Dicționar cu cheile mereu sortate: aceleași operații ca HashMap, dar parcurgerea și afișarea sunt în ordinea cheilor.