Vai al contenuto
eLearner.app
Modulo 7 · Lezione 1 di 213/14 nel corso~12 min
Lezioni del modulo (1/2)

Collezioni e HashMap

Le collezioni sono strutture dati in grado di contenere più valori. A differenza dei tipi primitivi array e tupla, i dati a cui fanno riferimento queste collezioni sono memorizzati nello heap, il che significa che la quantità di dati non deve essere nota a tempo di compilazione e può crescere o ridursi dinamicamente durante l'esecuzione del programma.

Le due collezioni più utilizzate in Rust sono i vettori (Vec<T>) e le mappe chiave-valore (HashMap<K, V>).


Vettori (Vec<T>)

I vettori consentono di memorizzare più di un valore dello stesso tipo in una singola struttura dati che mette tutti i valori uno accanto all'altro in memoria:

Code
fn main() {
    // Creazione di un vettore vuoto mutabile
    let mut v: Vec<i32> = Vec::new();

    // Oppure usando la macro vec!
    let mut v2 = vec![1, 2, 3];

    // Aggiunta di elementi
    v.push(5);
    v.push(6);

    // Accesso agli elementi per indice
    let third = v2[2];
    println!("Il terzo elemento è: {}", third);
}

HashMap (HashMap<K, V>)

La collezione HashMap<K, V> memorizza una mappatura di chiavi di tipo K a valori di tipo V. Funziona tramite una funzione di hashing, che determina come queste chiavi e valori vengono posizionati in memoria. È estremamente utile quando si vogliono cercare dati non tramite un indice numerico, ma tramite una chiave (ad esempio, un nome o un ID).

Code
use std::collections::HashMap;

fn main() {
    let mut scores = HashMap::new();

    // Inserimento chiave-valore
    scores.insert(String::from("Blu"), 10);
    scores.insert(String::from("Giallo"), 50);

    // Lettura di un valore (ritorna un Option<&V>)
    let team_name = String::from("Blu");
    let score = scores.get(&team_name);

    match score {
        Some(val) => println!("Punteggio: {}", val),
        None => println!("Nessun punteggio trovato."),
    }
}

Prova tu

Esercizio 1: Operazioni base su Vec

Esercizio#rust.m7.l1.e1
Tentativi: 0Caricamento…

Dichiara un vettore mutabile di interi chiamato v usando Vec::new(). Aggiungi al vettore gli elementi 10, 20 e 30 in sequenza usando il metodo push. Infine, stampa il primo elemento del vettore (indice 0) usando println!.

Caricamento editor…
Mostra suggerimento

Usa `let mut v = Vec::new();` per il vettore, inserisci gli elementi con `v.push(valore)` e accedi con `v[0]`.

Soluzione disponibile dopo 3 tentativi

Esercizio 2: Punteggi con HashMap

Esercizio#rust.m7.l1.e2
Tentativi: 0Caricamento…

Importa std::collections::HashMap. Nel main, dichiara una HashMap mutabile chiamata scores per memorizzare chiavi String e valori i32. Inserisci un punteggio di 50 per l'utente 'Alice'. Estrai in sicurezza il punteggio usando il metodo get ed unwrap() per stamparlo.

Caricamento editor…
Mostra suggerimento

Non dimenticare `use std::collections::HashMap;`. Inserisci con `scores.insert(String::from("Alice"), 50);`e recupera il valore con`.get("Alice").unwrap()`.

Soluzione disponibile dopo 3 tentativi

Esercizio 3: Raddoppiare i valori in un vettore

Esercizio#rust.m7.l1.e3
Tentativi: 0Caricamento…

Definisci una funzione chiamata double_values che accetta in input un riferimento a un vettore di interi &[i32] e restituisce un nuovo vettore Vec<i32> contenente gli stessi elementi moltiplicati per 2.

Caricamento editor…
Mostra suggerimento

La funzione deve scorrere gli elementi del slice ed inserirli moltiplicati per 2 nel nuovo vettore da ritornare.

Soluzione disponibile dopo 3 tentativi