Java: Gli Array ad oggetti ed ArrayList
Supponiamo di voler riempire un array di interi con valori letti da input.
Per accedere agli elementi di un array a usiamo un ciclo for con una variabile di controllo (usata come indice) che assume i valori da 0 al valore di a.length-1 (estremi inclusi).
|
La parte del codice del programma RiempiStampaArray che riempie l'array, o quella che ne stampa gli elementi potrebbero essere utili in altri programmi, ma non sono riutilizzabili: andrebbero copiate. Riscriviamole come metodi (statici) di una opportuna classe, ArrayUtils, in modo da poterli riusare liberamente. Si noti che:
|
Un tipico uso di un array consiste nello scandire (o visitare) in sequenza i suoi elementi, per esaminarli, modificarli, o confrontarli...Come abbiamo già visto per la lettura e scrittura, per scandire TUTTI gli elementi di un array a è naturale usare un comando forcon una variabile di controllo che assume i valori da 0 al valore di a.length-1 (estremi inclusi). Vedremo vari esempi di scansione di array con comandi for:
I metodi della classe ArrayUtils sono stati scelti per illustrare come sia possibile:
|
La ricerca del massimo elemento di un dato insieme di valori è un'operazione piuttosto frequente, ad esempio nella gestione di strutture con priorità. Per questo motivo la classe ArrayUtils realizza un metodo (statico) che preso un array di interi ne individua e restituisce il massimo valore. Si noti che:
|
I prossimi metodi di ArrayUtils calcolano il massimo, ma usando la ricorsione invece di un for. Il primo metodo, che è public, non fa altro che invocare un metodo ausiliario dichiarato private, quindi non invocabile all'esterno della classe. Il metodo ausiliario ha due parametri: concettualmente maxRecursive(array, i) restituisce il massimo degli elementi dell'array a partire dalla posizione i. Assumendo che 0 <= i <= array.length, il metodo usa la seguente definizione ricorsiva:
|
Il metodo sort di ArrayUtils ordina in modo crescente il contenuto dell'array passato per argomento, utilizzando due cicli forannidati.
Questo algoritmo di ordinamento è chiamato insertion sort e non è particolarmente efficiente. Ad esempio provate a pensare cosa succede se gli elementi sono inizialmente disposti in ordine inverso, dal più grande al più piccolo. Esistono numerosi altri algoritmi di ordinamento più efficienti: ne vedrete alcuni a Fondamenti di Programmazione. La cosa importante da notare è che gli scambi effettuati dal metodo si ripercuotono sull'array passato come argomento: questo è possibile perché il metodo conosce il riferimento all'oggetto-array. |
Il metodo clone di ArrayUtils restituisce una copia (clone) dell'array passato per argomento, cioè un array avente la stessa lunghezza e gli stessi elementi. .
|
La classe ArrayUtils realizza anche metodi statici per riempire e stampare array di stringhe. Il codice è analogo a quello che abbiamo visto per array di interi (ma la stampa avviene con un elemento per riga):
Esempio: Adesso che finalmente abbiamo tutti gli elementi per interpretare il parametro args del metodo main possiamo scrivere facilmente un programma che stampa eventuali argomenti passati da linea di comando. Ad esempio: > java TestArgs uno due "t r e" ...
|
Molti linguaggi mettono a disposizione un quarto costrutto iterativo, chiamato for-each, che permette di iterare sopra collezioni di dati (es. array, tipi enumerativi, insiemi, liste, ...) usando una sintassi particolarmente agevole e compatta. Dalla versione 5.0 anche Java ha introdotto un costrutto simile, chiamato for generalizzato, con una sintassi diversa da quella usata in altri linguaggi (per non introdurre una nuova parole chiave creando problemi di backward compatibility). La sintassi è:
Come esempi d'uso, vediamo due metodi: uno per stampare un array di stringhe e l'altro per calcolare la somma dei valori contenuti in un array di interi. Come esercizio, provate a confrontare il codice con quello che usa il ciclo for classico.
|
Commenti
Posta un commento