BTreeMap::first_key_value în Rust

Returnează perechea cu cea mai mică cheie (first) sau cu cea mai mare cheie (last); None dacă dicționarul e gol.

Sintaxă
pub fn first_key_value(&self) -> Option<(&K, &V)>
pub fn last_key_value(&self) -> Option<(&K, &V)>

Ce face BTreeMap::first_key_value

Pentru că un BTreeMap este sortat, cea mai mică și cea mai mare cheie se găsesc imediat. first_key_value() și last_key_value() le returnează, împreună cu valorile, ca Option<(&K, &V)>.

Pentru a le și scoate din dicționar există pop_first() și pop_last() (Rust 1.66), care returnează Option<(K, V)>. Așa, un BTreeMap poate servi și drept coadă de priorități în care poți căuta după cheie.

Ce returnează

Some((&cheie, &valoare)) sau None.

Exemple

Exemplul 1: Scorul minim și maxim

use std::collections::BTreeMap;

fn main() {
    let scoruri = BTreeMap::from([(85, "Mihai"), (97, "Ana"), (72, "Radu"), (91, "Ioana")]);
    println!("{:?}", scoruri.first_key_value());
    println!("{:?}", scoruri.last_key_value());
    if let Some((scor, nume)) = scoruri.last_key_value() {
        println!("câștigă {nume} cu {scor} puncte");
    }
    let gol: BTreeMap<u32, &str> = BTreeMap::new();
    println!("gol: {:?}", gol.first_key_value());
}

Rezultat

Some((72, "Radu"))
Some((97, "Ana"))
câștigă Ana cu 97 puncte
gol: None

Exemplul 2: Podiumul, cu pop_last

use std::collections::BTreeMap;

fn main() {
    let mut scoruri = BTreeMap::from([(85, "Mihai"), (97, "Ana"), (72, "Radu"), (91, "Ioana")]);
    for loc in 1..=3 {
        if let Some((scor, nume)) = scoruri.pop_last() {
            println!("locul {loc}: {nume} ({scor})");
        }
    }
    println!("rămas: {:?}", scoruri);
}

Rezultat

locul 1: Ana (97)
locul 2: Ioana (91)
locul 3: Mihai (85)
rămas: {72: "Radu"}

Greșeli frecvente

  • Folosești iter().next() și iter().last(): merg, dar last() parcurge tot. last_key_value() e direct.
  • Chei egale nu pot exista: dacă doi elevi au același scor, al doilea insert îl înlocuiește pe primul. Folosește cheia (scor, nume) sau valori de tip Vec.

Comenzi înrudite

  • BTreeMap: Dicționar cu cheile mereu sortate: aceleași operații ca HashMap, dar parcurgerea și afișarea sunt în ordinea cheilor.
  • BTreeSet::first: Returnează cel mai mic (first) sau cel mai mare (last) element al mulțimii sortate; None dacă e goală.
  • BTreeMap::range: Parcurge doar perechile cu cheile într-un interval (a..b, a..=b, a.., ..b), în ordine crescătoare.
  • BinaryHeap: Coadă de priorități: pop scoate mereu cel mai mare element, iar peek îl arată fără să-l scoată.