Ha

Hashmap ebben a kurzusban: Rust

{one: "1 feladat", other: "%{count} feladat"}

A(z) Hashmap fogalomról

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ása

A 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);

Értékek elérése a HashMap-ban

Ha 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.

Hatékonyság

A HashMap-ok viszonylag gyorsak, és minden olyan művelet amortizáltan állandó idejű (O(1)), amely egyetlen kulcsot érint.

Trait-korlátok

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.

Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg