Array e ArrayList: Gestire Più Valori
🎯 Obiettivi della lezione
- Comprendere cosa sono gli array in Java
- Confrontare array di Java con quelli del C
- Imparare ad usare ArrayList (array dinamici)
- Capire le differenze tra array e ArrayList
- Iterare sugli elementi con for, for-each
📚 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);
}
}
⚠️ 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-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);
}
}
❌ 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!");
}
}
}
📖 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);
}
}
🎨 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();
}
}
}
⚖️ 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:
- int → Integer
- double → Double
- boolean → Boolean
- char → Character
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
FACILEObiettivo: Creare un programma per gestire voti usando ArrayList.
Requisiti:
- Crea un ArrayList di Double per i voti
- Aggiungi almeno 7 voti
- Calcola e stampa la media
- Trova e stampa il voto massimo
- Trova e stampa il voto minimo
- 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
FACILEObiettivo: 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
MEDIOObiettivo: 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
MEDIOCrea 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
MEDIOCrea 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
DIFFICILECrea 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;