Vai al contenuto

Collezioni: Map

In questa lezione impari a

  • capire cosa sono le Map
  • usare HashMap
  • usare TreeMap
  • iterare su Map
  • esempi pratici

Cos'è una Map?

Una Map memorizza coppie chiave-valore.

Ogni chiave è unica e associata a un valore.

Esempio: Rubrica telefonica (nome → telefono)

HashMap base

import java.util.HashMap;

public class EsempioHashMap {
    public static void main(String[] args) {
        // Chiave = String, Valore = Integer
        HashMap eta = new HashMap<>();
        
        // Aggiungere coppie
        eta.put("Mario", 25);
        eta.put("Giulia", 30);
        eta.put("Luca", 22);
        
        // Ottenere valore
        int etaMario = eta.get("Mario");
        System.out.println("Età di Mario: " + etaMario);
        
        // Verificare presenza chiave
        if (eta.containsKey("Giulia")) {
            System.out.println("Giulia presente!");
        }
        
        // Verificare presenza valore
        if (eta.containsValue(22)) {
            System.out.println("C'è qualcuno con 22 anni");
        }
        
        // Dimensione
        System.out.println("Persone: " + eta.size());
        
        // Rimuovere
        eta.remove("Luca");
    }
}

Iterare su HashMap

import java.util.HashMap;

HashMap voti = new HashMap<>();
voti.put("Mario", 8);
voti.put("Giulia", 9);
voti.put("Luca", 7);

// Metodo 1: Iterare sulle chiavi
System.out.println("=== Solo Chiavi ===");
for (String nome : voti.keySet()) {
    System.out.println(nome);
}

// Metodo 2: Iterare sui valori
System.out.println("\n=== Solo Valori ===");
for (Integer voto : voti.values()) {
    System.out.println(voto);
}

// Metodo 3: Iterare su coppie (CONSIGLIATO)
System.out.println("\n=== Coppie ===");
for (String nome : voti.keySet()) {
    int voto = voti.get(nome);
    System.out.println(nome + ": " + voto);
}

// Metodo 4: Con Entry
System.out.println("\n=== Con Entry ===");
for (var entry : voti.entrySet()) {
    System.out.println(entry.getKey() + ": " + entry.getValue());
}

TreeMap - ordinato

import java.util.TreeMap;

TreeMap classifica = new TreeMap<>();
classifica.put("Luca", 85);
classifica.put("Mario", 92);
classifica.put("Giulia", 88);

// TreeMap ordina automaticamente per chiave!
for (String nome : classifica.keySet()) {
    System.out.println(nome + ": " + classifica.get(nome));
}
// Output ordinato: Giulia, Luca, Mario

Esempio: dizionario

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

public class Dizionario {
    public static void main(String[] args) {
        HashMap dizionario = new HashMap<>();
        
        // Aggiungo parole
        dizionario.put("hello", "ciao");
        dizionario.put("world", "mondo");
        dizionario.put("computer", "calcolatore");
        dizionario.put("java", "caffè (e linguaggio!)");
        dizionario.put("book", "libro");
        
        Scanner input = new Scanner(System.in);
        
        System.out.println("=== Dizionario Inglese-Italiano ===");
        System.out.println("Parole disponibili: " + dizionario.keySet());
        
        while (true) {
            System.out.print("\nParola da tradurre (o 'esci'): ");
            String parola = input.nextLine().toLowerCase();
            
            if (parola.equals("esci")) {
                break;
            }
            
            if (dizionario.containsKey(parola)) {
                System.out.println("Traduzione: " + dizionario.get(parola));
            } else {
                System.out.println("Parola non trovata!");
            }
        }
        
        input.close();
        System.out.println("Arrivederci!");
    }
}

Esempio: Contatore parole

import java.util.HashMap;

public class ContatoreParole {
    public static void main(String[] args) {
        String testo = "java è bello java è potente java è usato molto";
        String[] parole = testo.split(" ");
        
        HashMap conteggio = new HashMap<>();
        
        for (String parola : parole) {
            if (conteggio.containsKey(parola)) {
                // Incrementa conteggio esistente
                int count = conteggio.get(parola);
                conteggio.put(parola, count + 1);
            } else {
                // Prima occorrenza
                conteggio.put(parola, 1);
            }
        }
        
        System.out.println("=== Frequenza Parole ===");
        for (String parola : conteggio.keySet()) {
            System.out.println(parola + ": " + conteggio.get(parola) + " volte");
        }
    }
}

Esempio: registro studenti

import java.util.HashMap;
import java.util.ArrayList;

class Studente {
    private String nome;
    private ArrayList voti;
    
    public Studente(String nome) {
        this.nome = nome;
        this.voti = new ArrayList<>();
    }
    
    public void aggiungiVoto(int voto) {
        voti.add(voto);
    }
    
    public double getMedia() {
        if (voti.isEmpty()) return 0;
        int somma = 0;
        for (int voto : voti) {
            somma += voto;
        }
        return (double) somma / voti.size();
    }
    
    public String getNome() { return nome; }
    public ArrayList getVoti() { return voti; }
}

public class RegistroClasse {
    public static void main(String[] args) {
        HashMap registro = new HashMap<>();
        
        // Aggiungo studenti
        registro.put("12345", new Studente("Mario Rossi"));
        registro.put("67890", new Studente("Giulia Bianchi"));
        registro.put("11111", new Studente("Luca Verdi"));
        
        // Aggiungo voti
        registro.get("12345").aggiungiVoto(8);
        registro.get("12345").aggiungiVoto(7);
        registro.get("12345").aggiungiVoto(9);
        
        registro.get("67890").aggiungiVoto(9);
        registro.get("67890").aggiungiVoto(10);
        
        registro.get("11111").aggiungiVoto(6);
        registro.get("11111").aggiungiVoto(7);
        registro.get("11111").aggiungiVoto(6);
        
        // Stampo report
        System.out.println("=== Report Classe ===");
        for (String matricola : registro.keySet()) {
            Studente s = registro.get(matricola);
            System.out.println("\n" + s.getNome() + " (Matricola: " + matricola + ")");
            System.out.println("Voti: " + s.getVoti());
            System.out.println("Media: " + s.getMedia());
        }
    }
}

Esercizi

⭐ Facile

Esercizio 1 – rubrica telefonica.

HashMap per memorizzare nome → telefono

⭐⭐ Medio

Esercizio 2 – Magazzino.

HashMap per codice prodotto → quantità

⭐⭐ Medio

Esercizio 3 – statistiche testo.

Conta frequenza lettere in un testo con HashMap

Concetti chiave

  • Map = coppie chiave-valore
  • put(key, value) per aggiungere
  • get(key) per ottenere valore
  • containsKey() per verificare chiave
  • HashMap: non ordinata, veloce
  • TreeMap: ordinata per chiave
  • Perfetta per dizionari, rubrica, contatori