☕ Lezione 6

Array e ArrayList - Gestire Collezioni di Dati

Array e ArrayList: Gestire Più Valori

🎯 Obiettivi della lezione

📚 Array in Java

Un array è una struttura dati che contiene un numero fisso di elementi dello stesso tipo.

È simile agli array del C, ma con alcune differenze importanti!

🔄 Confronto Array: C vs Java

In C:

// Dichiarazione e inizializzazione
int numeri[5] = {10, 20, 30, 40, 50};

// Accesso agli elementi
printf("%d", numeri[0]);  // 10

// Dimensione
// Non puoi sapere la dimensione direttamente!
int size = sizeof(numeri) / sizeof(int);

In Java:

// Dichiarazione e inizializzazione
int[] numeri = {10, 20, 30, 40, 50};

// Accesso agli elementi
System.out.println(numeri[0]);  // 10

// Dimensione
int size = numeri.length;  // Proprietà .length!

📝 Dichiarare Array in Java

Ci sono diversi modi per creare array:

public class EsempiArray {
    public static void main(String[] args) {
        // Metodo 1: dichiarazione e inizializzazione diretta
        int[] numeri = {10, 20, 30, 40, 50};
        
        // Metodo 2: creare array vuoto di dimensione fissa
        int[] voti = new int[5];  // Array di 5 interi (inizializzati a 0)
        
        // Metodo 3: dichiarare prima, inizializzare dopo
        String[] nomi;
        nomi = new String[3];  // Array di 3 stringhe (inizializzate a null)
        
        // Assegnare valori
        voti[0] = 8;
        voti[1] = 7;
        voti[2] = 9;
        voti[3] = 6;
        voti[4] = 8;
        
        nomi[0] = "Mario";
        nomi[1] = "Giulia";
        nomi[2] = "Luca";
        
        // Stampare elementi
        System.out.println("Primo voto: " + voti[0]);
        System.out.println("Primo nome: " + nomi[0]);
        System.out.println("Numero di voti: " + voti.length);
    }
}
Primo voto: 8 Primo nome: Mario Numero di voti: 5

⚠️ Differenze importanti con il C:

  • In Java le parentesi quadre vanno DOPO il tipo: int[] non int numeri[] (anche se funziona)
  • Gli array in Java sono OGGETTI (hanno proprietà e metodi)
  • La dimensione è accessibile con .length
  • Gli array NON possono cambiare dimensione una volta creati
  • Java controlla i bounds (errore se accedi fuori dai limiti)

🔄 Iterare sugli Array

Possiamo scorrere gli array in vari modi:

public class IterazioneArray {
    public static void main(String[] args) {
        int[] voti = {8, 7, 9, 6, 8, 7, 10};
        
        // Metodo 1: for tradizionale (come in C)
        System.out.println("=== For tradizionale ===");
        for (int i = 0; i < voti.length; i++) {
            System.out.println("Voto " + (i+1) + ": " + voti[i]);
        }
        
        // Metodo 2: for-each (enhanced for loop)
        System.out.println("\n=== For-each ===");
        for (int voto : voti) {
            System.out.println("Voto: " + voto);
        }
        
        // Calcolare la media
        int somma = 0;
        for (int voto : voti) {
            somma += voto;
        }
        double media = (double) somma / voti.length;
        System.out.println("\nMedia voti: " + media);
    }
}
=== For tradizionale === Voto 1: 8 Voto 2: 7 Voto 3: 9 Voto 4: 6 Voto 5: 8 Voto 6: 7 Voto 7: 10 === For-each === Voto: 8 Voto: 7 Voto: 9 Voto: 6 Voto: 8 Voto: 7 Voto: 10 Media voti: 7.857142857142857

🔍 For-each loop (enhanced for)

Sintassi: for (tipo elemento : array)

Si legge: "per ogni elemento nell'array"

Vantaggi: più semplice, meno errori

Svantaggi: non hai l'indice, non puoi modificare l'array

🎨 Array di Oggetti

public class Studente {
    private String nome;
    private double media;
    
    public Studente(String nome, double media) {
        this.nome = nome;
        this.media = media;
    }
    
    public String getNome() {
        return nome;
    }
    
    public double getMedia() {
        return media;
    }
    
    public void stampa() {
        System.out.println(nome + " - Media: " + media);
    }
}

public class TestArrayOggetti {
    public static void main(String[] args) {
        // Creare array di oggetti
        Studente[] classe = new Studente[3];
        
        // Inizializzare gli oggetti
        classe[0] = new Studente("Mario", 7.5);
        classe[1] = new Studente("Giulia", 8.2);
        classe[2] = new Studente("Luca", 6.8);
        
        // Stampare tutti gli studenti
        System.out.println("=== Elenco Studenti ===");
        for (Studente s : classe) {
            s.stampa();
        }
        
        // Calcolare media della classe
        double sommaVoti = 0;
        for (Studente s : classe) {
            sommaVoti += s.getMedia();
        }
        double mediaClasse = sommaVoti / classe.length;
        System.out.println("\nMedia classe: " + mediaClasse);
    }
}
=== Elenco Studenti === Mario - Media: 7.5 Giulia - Media: 8.2 Luca - Media: 6.8 Media classe: 7.5

❌ Limiti degli Array

⚠️ Problemi con gli array tradizionali:

  • Dimensione fissa: una volta creati, non puoi aggiungere/rimuovere elementi
  • Sprechi di memoria: se non usi tutto l'array
  • Codice complesso: per inserire/rimuovere elementi serve spostare tutto
// Esempio del problema
int[] voti = new int[5];
voti[0] = 8;
voti[1] = 7;
// ... se voglio aggiungere un 6° voto? NON POSSO!
// Devo creare un nuovo array più grande e copiare tutto

🚀 Soluzione: ArrayList

ArrayList è una classe Java che implementa un array dinamico.

Può crescere e ridursi automaticamente!

È parte del Java Collections Framework.

📝 Usare ArrayList

import java.util.ArrayList;

public class EsempioArrayList {
    public static void main(String[] args) {
        // Creare un ArrayList di interi
        ArrayList<Integer> voti = new ArrayList<Integer>();
        
        // Aggiungere elementi
        voti.add(8);
        voti.add(7);
        voti.add(9);
        voti.add(6);
        
        System.out.println("Voti: " + voti);
        System.out.println("Numero voti: " + voti.size());
        
        // Aggiungere altri voti (l'array cresce automaticamente!)
        voti.add(10);
        voti.add(7);
        
        System.out.println("Voti aggiornati: " + voti);
        System.out.println("Numero voti: " + voti.size());
        
        // Accedere a un elemento
        System.out.println("Primo voto: " + voti.get(0));
        System.out.println("Ultimo voto: " + voti.get(voti.size() - 1));
        
        // Modificare un elemento
        voti.set(0, 9);  // Cambio il primo voto da 8 a 9
        System.out.println("Voti modificati: " + voti);
        
        // Rimuovere un elemento
        voti.remove(1);  // Rimuovo il secondo elemento
        System.out.println("Dopo rimozione: " + voti);
        
        // Verificare se contiene un elemento
        if (voti.contains(10)) {
            System.out.println("C'è almeno un 10!");
        }
    }
}
Voti: [8, 7, 9, 6] Numero voti: 4 Voti aggiornati: [8, 7, 9, 6, 10, 7] Numero voti: 6 Primo voto: 8 Ultimo voto: 7 Voti modificati: [9, 7, 9, 6, 10, 7] Dopo rimozione: [9, 9, 6, 10, 7] C'è almeno un 10!

📖 Metodi principali di ArrayList:

  • add(elemento) - aggiunge in coda
  • add(indice, elemento) - aggiunge in una posizione specifica
  • get(indice) - legge elemento
  • set(indice, elemento) - modifica elemento
  • remove(indice) - rimuove per indice
  • remove(oggetto) - rimuove per valore
  • size() - numero elementi
  • contains(elemento) - verifica presenza
  • clear() - svuota tutto
  • isEmpty() - verifica se vuoto

🔍 ArrayList di Stringhe

import java.util.ArrayList;

public class EsempioNomi {
    public static void main(String[] args) {
        ArrayList<String> nomi = new ArrayList<String>();
        
        // Aggiungere nomi
        nomi.add("Mario");
        nomi.add("Giulia");
        nomi.add("Luca");
        nomi.add("Anna");
        
        // Stampare con for-each
        System.out.println("=== Elenco Nomi ===");
        for (String nome : nomi) {
            System.out.println("- " + nome);
        }
        
        // Stampare con for tradizionale
        System.out.println("\n=== Con indice ===");
        for (int i = 0; i < nomi.size(); i++) {
            System.out.println((i+1) + ". " + nomi.get(i));
        }
        
        // Cercare un nome
        String nomeDaCercare = "Luca";
        if (nomi.contains(nomeDaCercare)) {
            int posizione = nomi.indexOf(nomeDaCercare);
            System.out.println("\n" + nomeDaCercare + " trovato in posizione " + posizione);
        }
        
        // Ordinare alfabeticamente
        nomi.sort(null);  // Ordinamento naturale
        System.out.println("\nNomi ordinati: " + nomi);
    }
}
=== Elenco Nomi === - Mario - Giulia - Luca - Anna === Con indice === 1. Mario 2. Giulia 3. Luca 4. Anna Luca trovato in posizione 2 Nomi ordinati: [Anna, Giulia, Luca, Mario]

🎨 ArrayList di Oggetti

import java.util.ArrayList;

class Prodotto {
    private String nome;
    private double prezzo;
    
    public Prodotto(String nome, double prezzo) {
        this.nome = nome;
        this.prezzo = prezzo;
    }
    
    public String getNome() {
        return nome;
    }
    
    public double getPrezzo() {
        return prezzo;
    }
    
    public void stampa() {
        System.out.println(nome + " - €" + prezzo);
    }
}

public class GestioneMagazzino {
    public static void main(String[] args) {
        // Creare ArrayList di prodotti
        ArrayList<Prodotto> magazzino = new ArrayList<Prodotto>();
        
        // Aggiungere prodotti
        magazzino.add(new Prodotto("Laptop", 799.99));
        magazzino.add(new Prodotto("Mouse", 25.50));
        magazzino.add(new Prodotto("Tastiera", 45.00));
        magazzino.add(new Prodotto("Monitor", 199.99));
        
        // Stampare tutti i prodotti
        System.out.println("=== Catalogo Prodotti ===");
        for (Prodotto p : magazzino) {
            p.stampa();
        }
        
        // Calcolare valore totale magazzino
        double totale = 0;
        for (Prodotto p : magazzino) {
            totale += p.getPrezzo();
        }
        System.out.println("\nValore totale: €" + totale);
        
        // Trovare prodotti sopra una certa cifra
        double soglia = 100;
        System.out.println("\nProdotti sopra €" + soglia + ":");
        for (Prodotto p : magazzino) {
            if (p.getPrezzo() > soglia) {
                p.stampa();
            }
        }
        
        // Rimuovere un prodotto
        magazzino.remove(1);  // Rimuovo il mouse
        System.out.println("\nDopo rimozione:");
        for (Prodotto p : magazzino) {
            p.stampa();
        }
    }
}
=== Catalogo Prodotti === Laptop - €799.99 Mouse - €25.5 Tastiera - €45.0 Monitor - €199.99 Valore totale: €1070.48 Prodotti sopra €100.0: Laptop - €799.99 Monitor - €199.99 Dopo rimozione: Laptop - €799.99 Tastiera - €45.0 Monitor - €199.99

⚖️ Array vs ArrayList

Caratteristica Array ArrayList
Dimensione Fissa Dinamica
Tipi primitivi Sì (int, double, etc.) No (usa Integer, Double, etc.)
Accesso elementi array[i] list.get(i)
Modifica elementi array[i] = valore list.set(i, valore)
Dimensione array.length list.size()
Prestazioni Leggermente più veloce Più lento ma più flessibile
Quando usare Dimensione nota e fissa Dimensione variabile

⚠️ Wrapper Classes

ArrayList non può contenere tipi primitivi, ma usa le Wrapper Classes:

  • intInteger
  • doubleDouble
  • booleanBoolean
  • charCharacter

Java fa automaticamente la conversione (autoboxing/unboxing)!

ArrayList<Integer> numeri = new ArrayList<Integer>();
numeri.add(10);  // Autoboxing: int → Integer
int valore = numeri.get(0);  // Unboxing: Integer → int

✏️ Esercizi Guidati

Esercizio 1: Registro Voti

FACILE

Obiettivo: Creare un programma per gestire voti usando ArrayList.

Requisiti:

  1. Crea un ArrayList di Double per i voti
  2. Aggiungi almeno 7 voti
  3. Calcola e stampa la media
  4. Trova e stampa il voto massimo
  5. Trova e stampa il voto minimo
  6. Conta quanti voti sono ≥ 6 (sufficienti)

Codice iniziale:

import java.util.ArrayList;

public class RegistroVoti {
    public static void main(String[] args) {
        ArrayList<Double> voti = new ArrayList<Double>();
        
        // Aggiungi voti
        voti.add(7.5);
        // ... aggiungi altri voti
        
        // Calcola media
        double somma = 0;
        for (double voto : voti) {
            somma += voto;
        }
        double media = somma / voti.size();
        
        // Completa tu il resto
    }
}

Esercizio 2: Lista della Spesa

FACILE

Obiettivo: Creare una lista della spesa con ArrayList.

Requisiti:

  • Crea un ArrayList di String per gli articoli
  • Aggiungi 5 articoli
  • Stampa la lista numerata
  • Rimuovi un articolo
  • Aggiungi 2 nuovi articoli
  • Stampa la lista finale
  • Cerca se "latte" è nella lista

Esercizio 3: Catalogo Libri

MEDIO

Obiettivo: Gestire un catalogo di libri con ArrayList.

Requisiti:

  • Crea una classe Libro (titolo, autore, pagine)
  • Crea un ArrayList di Libro
  • Aggiungi almeno 5 libri
  • Stampa tutti i libri
  • Trova e stampa i libri con più di 300 pagine
  • Calcola il numero medio di pagine

💪 Esercizi da Svolgere

Esercizio 4: Gestione Temperatura

MEDIO

Crea un programma che:

  • Memorizza temperature giornaliere in un ArrayList
  • Calcola temperatura media
  • Trova temperatura massima e minima
  • Conta giorni sopra i 30°
  • Conta giorni sotto i 10°

Esercizio 5: Rubrica Telefonica

MEDIO

Crea una classe Contatto (nome, telefono) e:

  • Usa ArrayList per memorizzare contatti
  • Metodo per aggiungere contatto
  • Metodo per cercare per nome
  • Metodo per rimuovere contatto
  • Metodo per stampare tutti i contatti ordinati

Esercizio 6: Studenti e Voti

DIFFICILE

Crea una classe Studente con:

  • Attributi: nome, ArrayList<Integer> voti
  • Metodo per aggiungere voto
  • Metodo per calcolare media
  • Metodo per verificare se è promosso (media ≥ 6)
  • Nel main, gestisci una classe di 5 studenti
  • Stampa chi è promosso e chi no

🎯 Concetti Chiave da Ricordare

  • Gli array hanno dimensione fissa, accesso veloce
  • ArrayList ha dimensione dinamica, più flessibile
  • Array: array[i], .length
  • ArrayList: .get(i), .size()
  • For-each: for (tipo elem : collezione)
  • ArrayList usa wrapper classes per tipi primitivi
  • Ricorda di importare: import java.util.ArrayList;