HashMap::keys în Rust

keys parcurge doar cheile, values doar valorile, iar values_mut dă valorile ca referințe mutabile, pentru modificare.

Sintaxă
pub fn keys(&self) -> Keys<'_, K, V>
pub fn values(&self) -> Values<'_, K, V>
pub fn values_mut(&mut self) -> ValuesMut<'_, K, V>   // Rust 1.10

Ce face HashMap::keys

keys() returnează un iterator peste &K, values() peste &V. Sunt utile pentru totaluri (values().sum()), maxime (values().max()) sau pentru a obține lista cheilor. Ordinea este aceeași aleatorie ca la iter(): sortează dacă afișezi.

values_mut() dă &mut V pentru fiecare valoare, ca să le modifici pe toate dintr-o trecere (o scumpire de 10%, resetarea contoarelor). Cheile nu pot fi modificate niciodată pe loc.

Variantele into_keys() și into_values() consumă dicționarul și dau cheile sau valorile prin valoare.

Ce returnează

Iteratori: Keys (elemente &K), Values (&V), ValuesMut (&mut V).

Exemple

Exemplul 1: Salarii: lista angajaților, total și mărire

use std::collections::HashMap;

fn main() {
    let mut salarii = HashMap::from([("Ana", 5200), ("Mihai", 4800), ("Ioana", 6100)]);

    let mut nume: Vec<&str> = salarii.keys().copied().collect();
    nume.sort();
    println!("angajați: {:?}", nume);

    let total: u32 = salarii.values().sum();
    println!("total salarii: {total} lei");

    for s in salarii.values_mut() {
        *s += *s / 10; // mărire de 10%
    }
    let mut noi: Vec<u32> = salarii.values().copied().collect();
    noi.sort();
    println!("după mărire (sortate): {:?}", noi);
}

Rezultat

angajați: ["Ana", "Ioana", "Mihai"]
total salarii: 16100 lei
după mărire (sortate): [5280, 5720, 6710]

Exemplul 2: Cel mai mare salariu și al cui este

values().max() dă doar valoarea. Pentru cheie, căutăm perechea cu iter().max_by_key.

use std::collections::HashMap;

fn main() {
    let salarii = HashMap::from([("Ana", 5200), ("Mihai", 4800), ("Ioana", 6100)]);
    println!("maxim: {:?}", salarii.values().max());
    if let Some((nume, s)) = salarii.iter().max_by_key(|&(_, s)| *s) {
        println!("{nume} câștigă cel mai mult: {s} lei");
    }
}

Rezultat

maxim: Some(6100)
Ioana câștigă cel mai mult: 6100 lei

Greșeli frecvente

  • Afișezi keys() direct și te aștepți la aceeași ordine la fiecare rulare. Colectează și sortează.
  • Încerci să modifici o cheie prin keys(): cheile sunt doar de citit. Scoate perechea cu remove și inserează cheia nouă.
  • values().sum() fără tip: type annotations needed. Scrie let total: u32 = ... sau sum::<u32>().

Comenzi înrudite

  • HashMap::iter: Parcurge perechile din dicționar: iter dă (&cheie, &valoare), iter_mut dă (&cheie, &mut valoare). Ordinea e aleatorie.
  • HashMap::len: len spune câte perechi cheie-valoare are dicționarul, is_empty dacă nu are niciuna, iar clear le șterge pe toate.
  • Iterator::sum: sum adună toate elementele, product le înmulțește; tipul rezultatului trebuie precizat.
  • Iterator::min_by_key: Găsește elementul minim sau maxim după un criteriu: o cheie calculată (by_key) sau o funcție de comparare (by).