β˜• Lezione 14

Collezioni: Map - Coppie Chiave-Valore

Map: Dizionari Chiave-Valore

🎯 Obiettivi

πŸ’‘ 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

Esercizio 1: Rubrica Telefonica

FACILE

HashMap per memorizzare nome β†’ telefono

Esercizio 2: Magazzino

MEDIO

HashMap per codice prodotto β†’ quantitΓ 

Esercizio 3: Statistiche Testo

MEDIO

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