Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Grouping Objects
L’obiettivo di queste pagine è comprendere alcune tecniche per raggruppare oggetti in una
collezione. In particolare impareremo ad utilizzare la classe ArrayList.
I concetti che verranno introdotti sono fondamentali per la programmazione. Devono essere
acquisiti prima di affrontare nuovi argomenti.
Abstraction
Abstraction:
permette di semplificare un problema, scomponendolo in parti autonome e autosufficienti, che si
possono, in prima istanza, sviluppare senza particolare attenzione ai dettagli,
Il principio su esposto trova la realizzazione nelle librerie: le classi messe a disposizione da Java
altro non sono che un supporto, generale e astratto, che semplificano lo sviluppo del software.
Realizzano il concetto di astrazione. Non nascono per risolvere un particolare problema ma
mettono a disposizione classi generiche che si possono utilizzare per risolvere problemi anche
molto diversi tra loro.
Quando si utilizzano le classi delle librerie si crea all’interno del nostro codice un’istanza della
classe. Avremo così a disposizione un oggetto con tutti i suoi metodi.
N.B. L’astrazione permette di individuare all’interno di un problema, componenti e situazioni
comuni ad altri problemi. In pratica permette di riutilizzare quanto creato per un problema nella
soluzione di altri problemi. Un informatico, attraverso l’astrazione, impara a cogliere analogie.
Collection
Un primo esempio di astrazione è l’idea di collection, cioè raggruppamento di oggetti che possono
essere manipolati tutti insieme, come una cosa unica.
Esempi di collection sono:
• gli studenti di una scuola
• gli studenti di una classe
• le automobili in circolazione in Italia
• le Ferrari in mio possesso (insieme vuoto)
Ci sono delle operazioni che sicuramente dovrò effettuare quando opero con una collection,
prescindendo dal tipo di raggruppamento. Sono operazioni che devo poter effettuare sia per un
raggruppamento di automobili, sia per un raggruppamento di libri, di studenti o di qualsiasi altra
cosa.
Sicuramente dovrò:
• aggiungere nuovi elementi alla collezione – add to
• eliminare degli elementi – remove: ad esempio eliminare tutte le automobili rottamate
• [riordinare il raggruppamento in base a criteri – ad esempio la data di immatricolazione
dell’automobile]
Esempi.
• Una biblioteca conserva per ogni volume una scheda descrittiva. La biblioteca deve poter
aggiungere nuove schede, in funzione degli acquisti e deve poter eliminare le schede di libri
ormai obsoleti;
• Un’università conserva una scheda per ogni studente iscritto; ogni anno si aggiungono nuovi
studenti, e si eliminano le schede degli studenti che non sono più iscritti; sicuramente
serviranno elenchi particolari: le matricole, tutti gli studenti iscritti ad un determinato corso,
etc
Negli esempi precedenti il numero di elementi di una collezione varia nel tempo, anche in modo
considerevole. Inoltre varia anche da problema a problema: le automobili immatricolate in Italia
sono milioni, il numero di studenti di una classe al massimo potranno essere 35.
La classe che realizzerà il concetto di collezione dovrà permettere di gestire allo stesso modo tutti i
casi.
ArrayList
Esercizio
• Si vuole organizzare l’elenco dei file musicali disponibili sul proprio computer. Per ora
interessa solo il nome del brano. Utilizzando un text editor indica quali operazioni di base
ritieni utili per svolgere il compito.
• Utilizzare il progetto music-organizer-v1. Quali delle operazioni indicate in precedenza sono
realizzate? Per rispondere a questa domanda creare con BlueJ un oggetto di tipo
MusicOrganizer. Col cursore posizionato sull’oggetto pigiare il tasto destro del mouse.
Comparirà una finestra di pop up. Leggere con attenzione i metodi messi a disposizione e
rispondere alla domanda.
• E’ possibile aggiungere dei file all’elenco? Come?
• Inseriti alcuni file, cosa avviene se si richiede il metodo numberOfFiles?
• Utilizzare il metodo listOfFile dal menu di pop up. Ha dei parametri? Di che tipo? Secondo
te quale valore si deve fornire? Cosa capita con i numeri negativi?
• Cosa succede se si crea un nuovo oggetto di tipo MusicOrganizer e si richiede di rimuovere
l’elemento 0?
• Aggiungere due file all’oggetto di tipo MusicOrganizer. Richiamare il metodo listFile(0) e
listFile(1). Utilizzare il metodo removeFile(0) e quindi listFile(0). Cosa noti? Puoi motivare
il risultato? Puoi verificare la tua risposta utilizzando il comando inspect nel menu di pop
up?
• La classe ArrayList compare nel diagramma della classi visualizzato da BlueJ?
Esercizi
• utilizzando il ciclo definito in precedenza realizzare il metodo listAllFiles
• modificare il metodo listAllFiles visualizzando anche la posizione occupata all’interno della
lista
• realizzare il metodo listMatching che visualizza solo i titoli che contengono una
determinata stringa di ricerca. Può capitare che non venga visualizzato nulla? Perché? Quali
sono le operazioni sulle stringhe che permettono listMatching?
• Modificare listMatching in modo tale che venga visualizzato un messaggio opportuno se
non esistono elementi che soddisfano la ricerca.
• Modificare listMatching in modo tale che venga sia visualizzato il brano trovato, sia venga
suonato per pochi secondi. Utilizzare per questo il metodo playSample di MusicPlayer
• Utilizzando il debug segui l’esecuzione di listAllFiles. Inserisci un breakpoint subito prima
dell’istruzione for-each e prosegui passo a passo.
• Se i dati associati ad ogni brano crescono, ecco che la stringa non basta più. Supponiamo di
avere a disposizione una classe Track con tutte le informazioni. Quali metodi deve mettermi
a disposizione Tack per poter realizzare listAllFiles e listMatching?
Cicli
indefiniti
Con for-each si conosce quante volte viene ripetuto un ciclo, poiché coincide col numero di
elementi contenuti nell’ArrayList. Ci sono delle situazioni per cui questo non è possibile: debbo
ripetere delle azioni sino a quando non si verifica una certa situazione.
[individuare degli esempi]
Per risolvere questa tipologia di problemi java mette a disposizione il ciclo while.
while ( condizione )
{
istruzione1;
istruzione2;
…
}
Esercizio
• scrivi una nuova versione del metodo listAllFile() utilizzando un ciclo while ed un indice.
• boolean assente = true;
int i = 0;
while ( assente )
{
if ( files.get(i).equals( nomeFile ) )
assente = false;
else
i = i + 1;
}