Sei sulla pagina 1di 7

Object first with java

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?

Come utilizzare una classe della libreria java


Se si osserva il sorgente della classe MusicOrganizer si nota che la prima riga è la seguente
import java.util.ArrayList;
Il significato è il seguente: le classi delle librerie di java sono organizzate in package. Con la dot
notation si indica che la classe ArrayList si trova nel package util di java. Dopo tale istruzione la
classe ArrayList diventa disponibile, esattamente come se fosse una classe sviluppata da noi.
Si potrà allora scrivere:
private ArrayList<String> files;
Da notare la presenza di <String>. La classe ArrayList è una classe general-purpose. E’ una classe
multiuso alla quale bisogna fornire un’ulteriore specificazione al momento dell’utilizzo:
l’indicazione del tipo di dato che dovrà contenere.
In pratica quando si utilizza una collection è necessario indicare sia il tipo della collection (
ArrayList ) sia il tipo di dato che verrà gestito ( String ).
Ultima osservazione
files = new ArrayList<>();
Nel richiamo del costruttore compaiono <>. E’ una semplificazione.
files = new ArrayList<String>();
Esercizio
• Utilizzando la classe MusicOrganizer, creare un oggetto. Inserire alcuni file. Con inspect
analizzare la struttura della variabile files. Prestare particolare attenzione agli indici e alle
dimensioni.
• Eliminare alcuni elementi dalla variabile files. Controllare con inspect come vengono
riorganizzati i dati, gli indici, le dimensioni.
• Aggiungere un metodo privato checkIndex per il controllo degli indici. Quando un indice è
valido? Modificare i metodi di MusicOrganizer coinvolti nella modifica.
• Nella finestra code pad di BlueJ scrivere le seguenti due linee:
import java.util.ArrayList;
new ArrayList<String>()
dopo aver digitato la seconda linea comparirà un’icona. Trascinarla su object bench.
Verrà creato un oggetto di tipo ArrayList. Tasto destro del mouse posizionato sull’oggetto.
Esaminare i metodi visualizzati e testarne alcuni quali add remove size isEmpty.
Provare a richiamare gli stessi metodi utilizzando la finestra code pad, ricordando di
premettere al nome del metodo il nome dell’oggetto (dot notation)

Approfondimento: ascoltare mp3


Rifacendosi nuovamente al concetto di abstraction possiamo immaginare che per ascoltare file mp3
occorra una classe che permetta di leggere file mp3 e trasformarli in suoni. Per ascoltare i file
bisogna poter indicare il nome del file, avviare l’ascolto ed eventualmente interrompere.
Nelle librerie standard di java non esistono classi che ci possono aiutare, ma con una ricerca in
internet se ne possono trovare diverse. In questo caso si parla di “third part library”.
Esercizio
• Scaricare da moodle la classe MusicPlayer ed inserirla nel progetto.
• La classe MusicPlayer mette a disposizione alcuni metodi. Per scoprire quali crea un oggetto
di tipo MusicPlayer ed osserva quali sono i metodi messi a disposizione. Presta particolare
attenzione alla firma. Prova ad ascoltare un file mp3, se possibile.
• Apri la documentazione relativa a MusicPlayer ed analizzala con attenzione, chiarendoti le
idee sui diversi metodi messi a disposizione.
• Aggiungi al progetto MusicOrganizer due nuovi metodi, dichiarati sotto, modificando
eventualmente le variabili di stato. Verifica il funzionamento e, per ciascun metodo, inserisci
la documentazione precisa.
void startPlaying( int index )
void stopPlaying()

Gestire l’intera collection


Esercizio
• senza utilizzare cicli realizzare il metodo listAllFiles di MusicOrganizer.
L’esercizio precedente sicuramente avrà creato qualche problema
Per risolverlo correttamente vediamo come utilizzare le istruzioni di ciclo, cioè le istruzioni che
permettono di ripetere le operazioni il numero necessario di volte.
Ad esempio il modo corretto per risolvere il problema precedente consiste nello scrivere una sola
volta l’istruzione di stampa e ripeterla per ogni elemento contenuto nella collection. Questo è
possibile utilizzando il ciclo for-each.
for (String filename : files)
{
System.out.println( filename );
}

[vedere insieme la struttura del ciclo for-each]

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;

}

[descrizione ciclo while]

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;
}

osservare con attenzione le precedenti istruzioni. Cosa realizzano?


Ci sono possibilità di errore in esecuzione? Perché?
Crea il metodo findFirst, con eventuali parametri utilizzando il codice precedente per
realizzarlo.

• boolean trovato = true;


while ( …. )
{
if ( files.get(i).equals( nomeFile ) )
……
else
…….
}

completa il codice precedente per svolgere il compito.


Modifica findFirst con il nuovo codice.

• Esercizi con cicli:


Calcola la somma dei primi 100 numeri interi
Calcola la somma dei primi 100 numeri interi divisibili per 5
Determinare la lunghezza massima tra le stringhe di un ArrayList di stringhe
Consideriamo il criterio: la lunghezza di una stringa è il numero di vocali che contiene.
Cosa significa : la stringa ha lunghezza zero?
modifica del progetto

Potrebbero piacerti anche