A HashMap olyan konténer, amelyben kulcs-érték párokat tárolhatsz. Más programozási nyelvekben ezt az adatszerkezetet néha asszociatív tömbnek vagy hash-táblának nevezik. A tároló kulcsok egy halmazát tartalmazza, és minden kulcs egy adott értékhez van rendelve. A tárolt értéket úgy kérheted le, hogy megadod a hozzá tartozó kulcsot. Kulcsokat és a hozzájuk tartozó értékeket is beszúrhatsz és törölhetsz.
A HashMap generikus gyűjtemény (akárcsak a standard könyvtár legtöbb gyűjteménye), ezért kulcsként a legkülönfélébb típusokat is támogatja, beleértve a felhasználó által definiált structokat és tuple-öket is. Az értékei bármilyen típusúak lehetnek.
HashMap létrehozásaA HashMap-ot a HashMap::new() függvénnyel hozod létre. Az alábbi kódrészlet egy HashMap-ot hoz létre, amelyben a csapatnevek pontszámokhoz vannak rendelve.
use std::collections::HashMap;
let mut scores = HashMap::new();
scores.insert(String::from("Blue"), 10);
scores.insert(String::from("Yellow"), 50);
HashMap-banHa biztosan tudod, hogy egy érték létezik egy HashMap-ban, akkor nyugodtan használhatod az indexelő operátort ([]). A kék csapat pontszámát például így kérheted le: scores["Blue"]. Ha azonban a megfelelő kulcs-érték pár nem szerepel a hashmapban, ez a művelet pánikot okoz.
Az indexelő operátoron kívül két másik módja is van a HashMap-ban tárolt értékek elérésének. Az első a get tagfüggvény:
if let Some(blue_score) = scores.get("Blue") {
println!("Blue scored: {blue_score} \n");
}
A get a kért kulcshoz tartozó értéket éri el. None-t ad vissza, ha a megadott kulcs nem létezik a HashMap-ban, és Some(value)-t, ha létezik. Ha bővebben szeretnél olvasni a Rust Option típusáról, nézd meg az Option fogalmat.
A HashMap-ban tárolt értékek elérésének másik módja az entry metódus használata. Az entry metódus (az entry API) referenciát ad vissza a kulcs-érték pár bejegyzésére a HashMap-ban. A bejegyzés azt képviseli, hogy éppen milyen állapotban van ez a kulcs a hash-ben. Ha a kulcs nem létezik, akkor nincs érték a bejegyzésben (és lehetőség nyílik egy beszúrására).
let mut vote_counter: HashMap<_, usize> = HashMap::new();
let votes = ["Blue", "Red", "Red", "Blue", "Red", "Blue", "Blue"];
for vote in votes {
let count = vote_counter.entry(vote).or_default();
*count += 1;
}
println!("{vote_counter:#?}");
Ez az API nagyon kényelmessé tesz bizonyos gyakori hozzáférési mintákat, és külön fogalom (Entry API) foglalkozik vele.
A HashMap-ok viszonylag gyorsak, és minden olyan művelet amortizáltan állandó idejű (O(1)), amely egyetlen kulcsot érint.
A HashMap generikus adatszerkezet, ami azt jelenti, hogy tetszőleges típusokat támogat kulcsként és értékként, egyetlen megkötéssel: ahhoz, hogy egy típus kulcstípusként használható legyen, két trait implementációjával kell rendelkeznie: Eq és Hash. Az érték típusára nincs trait-korlát.