CodeGym /Corsi /JAVA 25 SELF /«Il proprio dizionario» — HashMap<K,V>

«Il proprio dizionario» — HashMap<K,V>

JAVA 25 SELF
Livello 12, Lezione 2
Disponibile

1. Introduzione

Sappiamo già che ArrayList è un «array infinito» che cresce da solo. Ma ha una limitazione: l’accesso agli elementi avviene per numero (indice). Se abbiamo un elenco di mille persone e vogliamo trovare il telefono di Alisa, bisogna o conoscerne l’indice, oppure scorrere tutti in sequenza.

Nella vita invece cerchiamo spesso i dati in base a un tratto unico:

  • cerchiamo il numero di telefono per nome,
  • cerchiamo il titolare per numero di passaporto,
  • in base al login troviamo la password,
  • per id cerchiamo l’oggetto nel database.

Per questo serve una struttura che faccia: «ricevo una chiave → trovo subito il valore». In Java se ne occupa HashMap<K,V>.

Analogia:
Immaginate un normale dizionario cartaceo. Cercate la traduzione della parola «house». Non dovete sfogliare tutte le pagine in ordine. Andate subito alla lettera «H» e trovate la parola desiderata. Così funziona anche HashMap: tramite la chiave (la parola) otteniamo istantaneamente il valore (la traduzione).

Creazione di un dizionario

Per creare un dizionario, bisogna indicare quali tipi saranno le chiavi e quali i valori.

import java.util.HashMap;

HashMap<String, String> phonebook = new HashMap<String, String>();

Qui:

  • String (primo tipo) è il tipo della chiave (nome della persona).
  • String (secondo tipo) è il tipo del valore (numero di telefono).

Ora phonebook è come una vera rubrica telefonica.

Altri esempi:

HashMap<String, Integer> grades = new HashMap<String, Integer>();  // nome → voto
HashMap<Integer, String> users = new HashMap<Integer, String>();   // id → nome
HashMap<String, Boolean> flags = new HashMap<String, Boolean>();   // chiave → valore booleano

A differenza di ArrayList, un dizionario non ha il metodo add(), ma ne ha di propri altrettanto interessanti.

2. Metodo put(key, value) — aggiungere una coppia

La principale differenza di HashMap rispetto ad array e liste è che non memorizza solo un insieme di valori, ma coppie chiave–valore. Questo lo rende simile a un vero dizionario: ogni parola ha una traduzione, ogni nome un telefono, ogni login una password.

Esempio:

phonebook.put("Alisa", "+380501112233");
phonebook.put("Bob", "+380671234567");

Ora nella nostra rubrica telefonica:

  • la chiave "Alisa" è associata al valore "+10501112233",
  • la chiave "Bob" è associata al valore "+10671234567".

Significa che per ottenere il valore (telefono) ci basta conoscere la chiave (nome).

È importante ricordare: le chiavi sono univoche. Se proviamo ad aggiungere un nuovo valore con una chiave già esistente, il valore precedente verrà sovrascritto.

phonebook.put("Alisa", "+10999999999");

Ora ad Alisa è rimasto solo il nuovo numero: quello vecchio è andato perduto.

Conclusione: put è il metodo per aggiungere o aggiornare le voci. Se la chiave è nuova — la voce viene creata. Se la chiave esiste già — la voce viene aggiornata.

3. Metodo get(key) — ottenere un valore

Per trovare un valore bisogna conoscere la chiave. Questa è la caratteristica principale di HashMap: la ricerca per chiave è molto veloce, praticamente istantanea, sia che abbiamo mille voci sia un milione.

Esempio:

System.out.println(phonebook.get("Alisa"));

Output:

+10501112233

Se tale chiave non esiste, get restituirà null:

System.out.println(phonebook.get("Charli")); // null

Significa: «la chiave "Charli" non è presente nel dizionario».

4. Metodo containsKey(key) — verificare la presenza

Per evitare di imbattersi in null, è utile controllare prima se la chiave è nel dizionario.

Esempio:

System.out.println(phonebook.containsKey("Charli"));

Output:

false

Così possiamo capire in anticipo:

  • se la chiave non c’è — creiamo una nuova voce,
  • se la chiave c’è — la aggiorniamo.

Schema frequente:

if (phonebook.containsKey("Alisa")) 
{
    System.out.println("Alisa ha già un numero!");
} 
else 
{
    phonebook.put("Alisa", "+10111111111");
}

5. Metodo remove(key) — eliminare una voce

La rimozione è altrettanto semplice: bisogna solo conoscere la chiave.

phonebook.remove("Bob");
System.out.println(phonebook.get("Bob"));

Output:

null

Ora la voce con chiave "Bob" non è più presente nel dizionario.

6. Iterare tutte le coppie

Spesso è necessario non solo ottenere i dati per una chiave specifica, ma anche stampare l’intero dizionario. Per questo si usa il metodo entrySet().

for (var entry : phonebook.entrySet()) {
    System.out.println(entry.getKey() + " -> " + entry.getValue());
}

Esempio di output:

Alisa -> +10501112233

In questo modo otteniamo subito accesso sia alla chiave (entry.getKey()) sia al valore (entry.getValue()).

7. Pratica: conteggio delle parole

Consideriamo un problema classico — contare quante volte le parole si ripetono in un testo. È uno degli esempi più chiari del perché serve HashMap.

String text = "java java core java";
HashMap<String, Integer> freq = new HashMap<String, Integer>();

for (String w : text.split(" ")) 
{
    Integer old = freq.get(w);
    freq.put(w, (old == null) ? 1 : old + 1);
}

System.out.println(freq);

Output:

{core=1, java=3}

Analizziamo in dettaglio cosa succede qui:

  1. Abbiamo diviso la stringa "java java core java" in parole.
  2. Per ogni parola verifichiamo se è già nel dizionario (freq.get(w)).
  3. Se non c’è (null), significa che è la prima occorrenza → mettiamo 1.
  4. Se c’è, significa che la parola è già apparsa → incrementiamo il valore di uno.

Applicazioni reali:

  • conteggio del numero di chiamate a un’API,
  • statistiche di frequenza delle parole in un testo,
  • memorizzazione delle quantità di prodotti in magazzino.

8. Pratica: rubrica telefonica

Scriviamo un’applicazione un po’ più grande.

import java.util.HashMap;
import java.util.Scanner;

public class PhonebookApp {
    public static void main(String[] args) 
    {
        HashMap<String, String> phonebook = new HashMap<String, String>();
        Scanner console = new Scanner(System.in);

        while (true) 
        {
            System.out.print("Inserisci un nome (o una riga vuota per uscire): ");
            String name = console.nextLine();
            if (name.isEmpty()) break;

            System.out.print("Inserisci il numero: ");
            String phone = console.nextLine();

            phonebook.put(name, phone);
        }

        System.out.println("Rubrica telefonica:");
        for (var entry : phonebook.entrySet()) 
        {
            System.out.println(entry.getKey() + " -> " + entry.getValue());
        }
    }
}

Il programma funziona come un mini‑repertorio. Inserisci nomi e numeri di telefono: vengono salvati in HashMap. Alla fine puoi stampare l’elenco completo. I dizionari sono molto usati nei progetti reali.

1
Compito
JAVA 25 SELF, livello 12, lezione 2
Bloccato
Aggiunta e recupero di un valore
Aggiunta e recupero di un valore
1
Compito
JAVA 25 SELF, livello 12, lezione 2
Bloccato
Verifica della presenza di una chiave
Verifica della presenza di una chiave
1
Compito
JAVA 25 SELF, livello 12, lezione 2
Bloccato
Rimozione di un elemento dalla mappa
Rimozione di un elemento dalla mappa
1
Compito
JAVA 25 SELF, livello 12, lezione 2
Bloccato
Conteggio delle parole in un testo
Conteggio delle parole in un testo
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION