HashMap::get în Rust

get caută o cheie și returnează Some(&valoare) sau None; contains_key spune doar dacă cheia există.

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

Ce face HashMap::get

get(&cheie) returnează o referință la valoare, în Some, sau None dacă cheia nu există. Este varianta sigură a indexării m[&cheie], care oprește programul pentru o cheie lipsă.

Cheia se dă prin referință și poate avea o formă „împrumutată” a tipului cheii: pentru HashMap<String, _> poți căuta cu un &str (m.get("Ana")), fără să creezi un String nou. Asta permite constrângerea K: Borrow<Q>.

contains_key răspunde doar cu true sau false. Dacă ai nevoie și de valoare, folosește direct get, ca să nu cauți de două ori. Pentru o valoare implicită când cheia lipsește: m.get(k).copied().unwrap_or(0).

Parametri

Parametru Descriere
k Referință la cheia căutată (sau la o formă împrumutată a ei, de exemplu &str pentru chei String).

Ce returnează

get: Option<&V>. contains_key: bool.

Exemple

Exemplul 1: Prețuri la magazin

use std::collections::HashMap;

fn main() {
    let preturi = HashMap::from([("pâine", 5), ("lapte", 8), ("cafea", 25)]);
    println!("{:?}", preturi.get("lapte"));
    println!("{:?}", preturi.get("ceai"));

    match preturi.get("cafea") {
        Some(p) => println!("cafeaua costă {p} lei"),
        None => println!("nu avem cafea"),
    }
    println!("avem ceai? {}", preturi.contains_key("ceai"));

    let pret_ceai = preturi.get("ceai").copied().unwrap_or(0);
    println!("prețul ceaiului (0 dacă lipsește): {pret_ceai}");
}

Rezultat

Some(8)
None
cafeaua costă 25 lei
avem ceai? false
prețul ceaiului (0 dacă lipsește): 0

Exemplul 2: Codurile județelor, citite de la tastatură

Textul citit este String, iar cheile sunt &str; cod.as_str() face legătura.

use std::collections::HashMap;
use std::io::{self, BufRead};

fn main() {
    let judete = HashMap::from([("IS", "Iași"), ("CJ", "Cluj"), ("B", "București"), ("TM", "Timiș")]);
    for linie in io::stdin().lock().lines() {
        let cod = linie.expect("eroare la citire").trim().to_uppercase();
        if let Some(nume) = judete.get(cod.as_str()) {
            println!("{cod} = {nume}");
        } else {
            println!("{cod}: cod necunoscut");
        }
    }
}

Ce scrie utilizatorul (intrare)

is
CJ
XY

Rezultat

IS = Iași
CJ = Cluj
XY: cod necunoscut

Greșeli frecvente

  • Folosești m["cheie"] pentru o cheie care poate lipsi: programul se oprește. Folosește get.
  • Scrii if m.contains_key(k) { let v = m[k]; ... }: cauți de două ori. if let Some(v) = m.get(k) caută o dată.
  • Te aștepți ca get să returneze valoarea, nu o referință: let n: i32 = m.get("a").unwrap(); dă expected `i32`, found `&i32`. Adaugă .copied() (pentru tipuri Copy) sau .cloned().

Comenzi înrudite

  • HashMap::get_mut: Returnează o referință mutabilă la valoarea unei chei, ca s-o modifici pe loc; None dacă cheia nu există.
  • HashMap::insert: Pune o pereche cheie-valoare în dicționar; dacă cheia exista, înlocuiește valoarea și o returnează pe cea veche.
  • HashMap::entry: Caută o cheie o singură dată și îți dă „locul” ei (Entry), ca să inserezi, să citești sau să modifici fără o a doua căutare.
  • Vec::get: Citește elementul de pe o poziție fără risc de panic: returnează Some(&element) sau None dacă poziția nu există.
  • BTreeMap: Dicționar cu cheile mereu sortate: aceleași operații ca HashMap, dar parcurgerea și afișarea sunt în ordinea cheilor.