79643 Letture

Corso Java - Quinta lezione: array, vector e applet

Dopo aver concluso con la scorsa lezione la parte introduttiva del nostro excursus, possiamo cominciare ad occuparci di alcuni aspetti intimi del linguaggio e alla conoscenza delle classi più utili. Cominceremo con le prime strutture dati semplici (array e vector) e con le applet.

Array e Vector
In molti dei nostri programmi abbiamo la necessità di organizzare una certa quantità di dati, omogenei e non, in maniera compatta, al fine di creare una "lista" di variabili (non importa il tipo) che siano raggruppate da un punto di vista logico. Se, ad esempio, abbiamo bisogno di gestire una lista di nominativi risulta molto scomodo dichiarare un gran numero di variabili, una per ogni persona. Abbiamo quindi bisogno di qualcosa di leggermente più complesso, che prende il nome di struttura dati. Le strutture dati più semplici sono gli array: potete pensare ad un array come una successione di celle consecutive di memoria, ognuna delle quali è destinata ad un elemento (questa definizione non è quella più rigorosa perché riguarda da vicino l'implementazione, ma è funzionale per i nostri scopi). La dichiarazione di un array in Java ha la seguente sintassi:

Tipo-dato nome_array = new Tipo-dato[NUMERO ELEMENTI];
ad esempio
int numeri_enalotto = new int[7];


La cosa più lampante in questa sintassi è che Java considera l'array come un vero e proprio oggetto, quindi la creazione deve essere eseguita con l'operatore new. Inoltre NUMERO ELEMENTI deve necessariamente essere una costante: in genere si evita la dicitura sopra proposta e si scrive

final int MAX_NUMERI = 7;
int numeri_enalotto = new int[MAX_NUMERI];


e si tende ad utilizzare MAX_NUMERI in luogo del suo valore durante tutto il programma. Il motivo è semplice: supponiamo che un giorno vengano cambiate le regole del gioco in questione (d'altro canto è già avvenuto per il totocalcio), se volete continuare ad utilizzare il programma e avete scritto numerose volte 7 invece di MAX_NUMERI dovrete fare un buon numero di modifiche. Questa operazione risulta oltremodo difficoltosa se il programma non l'avete scritto voi stessi, poiché molto spesso i commenti risultano carenti: non sarebbe quindi possibile distinguere i 7 che rappresentano la dimensione del vettore da eventuali altri 7 presenti nel programma.
Notate inoltre che fino ad ora abbiamo creato solo l'array, i singoli oggetti devono essere creati separatamente. Questi singoli elementi sono accessibili direttamente conoscendo la loro posizione nell'array che prende il nome di indice, quindi risulta conveniente accedere agli elementi del vettore tramite una variabile intera (l'indice appunto) che in questo esempio gestiamo con un ciclo for. Vogliamo inizializzare a 1 tutti gli elementi del suddetto vettore:

int i;
for ( i=0 ; i<MAX_NUMERI ; i++ )
    numeri_enalotto[i] = 1;



Quello che avete appena visto è il metodo standard per accedere a tutti gli elementi del vettore. I più attenti avranno notato che il ciclo parte da 0 (e non da uno) e termina a MAX_NUMERI -1. Non si tratta di un errore: infatti Java numeri gli elementi del vettore, come molti altri linguaggi, partendo dalla posizione zero e NON dalla posizione uno. Notate come in questo caso non abbiamo usato l'operatore new per istanziare i singoli elementi poiché si tratta di tipi di dato predefiniti: se avessimo voluto creare un array di stringhe, ad esempio, avremmo potuto inizializzarlo in questo modo:

for ( i=0 ; i<MAX_STRINGHE ; i++ )
    nomi[i] = new String("Inserire un nome");


Poiché possiamo accedere agli elementi del vettore tramite indice è del tutto valida una dicitura di questo tipo:

nomi[2] = new String("Ilsoftware.it")

nella quale dovete prestare molta attenzione al fatto che state indirizzando l'elemento in posizione due, quindi il terzo e non il secondo. A mio avviso questo è l'errore più comune commesso da chi si avvicina al linguaggio senza avere esperienze di programmazione.

Vector
Fino a qui potrebbe sembrare che poiché possiamo accedere facilmente a tutti gli elementi dell'array esso sia una struttura dati pressoché perfetta. In realtà esso ha un grosso difetto di fondo: bisogna conoscere a priori il numero massimo di dati da inserire. Se, per esempio, dobbiamo gestire un archivio destinato a crescere nel tempo è del tutto inefficiente poiché potremmo trovarci un giorno a dover correggere direttamente il codice. Al contrario nell'esempio dei numeri del super enalotto esso è sicuramente la struttura dati più conveniente poiché il numero degli elementi da considerare è noto a priori (6+1). In realtà l'array ha anche degli altri aspetti negativi relativi all'utilizzo della memoria di cui non ci occuperemo sia perché esulano dai nostri scopi sia perché nei pc moderni che dispongono di grosse quantità di memoria non siamo mai portati ad occuparcene. Al lettore basti sapere che l'array è la struttura dati indicata se il numero dei dati è conosciuto a priori (oppure è conosciuto il loro massimo valore, ad esempio nella gestione dell'anagrafica di una piccola azienda si può tranquillamente stimare un valore per eccesso) ed è relativamente basso.


Per ovviare a questo inconveniente la teoria delle strutture dati ci offre varie alternative, una delle quali è implementata in Java tramite la classe Vector che offre, rispetto all'array, i seguenti vantaggi:
- La sua dimensione può variare dinamicamente
- E' possibile inserire e cancellare elementi in qualunque posizione senza lasciare "buchi" tramite l'invocazione di opportuni metodi
- Gli elementi del vector possono essere anche disomogenei.
La classe Vector fa parte del package java.util, quindi dobbiamo importarlo all'inizio del listato. Potete scaricare da qui un listato che contiene esempi delle più comuni operazioni che possono essere svolte su questa struttura dati, debitamente commentati.
Per quanto riguarda l'efficienza del vector è doveroso precisare che esso è meno performante dell'array se vengono effettuate ripetute operazioni di inserimento e cancellazione e che il suo utilizzo deve essere limitato a insiemi non eccessivamente numerosi, per i quali è necessario usare strutture dati complesse o, nei casi estremi, database.


Corso Java - Quinta lezione: array, vector e applet - IlSoftware.it