ARRAY
Per assegnare più di un valore dello stesso tipo alla stessa variabile si usano gli array (detto anche vettore).
Gli array in Java sono degli oggetti : il programmatore deve preoccuparsi solo di conoscere l'interfaccia ed i metodi forniti.
Essendo un oggetto va dichiarato con new. Per dichiarare un array (2 modi che ottengono lo stesso risultato):
TipoDati[] Nome = new TipoDati[Dimensione];
TipoDati Nome[] = new TipoDati[Dimensione];
• TipoDati è il tipo di dati contenuti nell'array
• Nome
è il nome scelto per la
variabile che avrà come
riferimento l'allocamento in memoria dell'oggetto
•
[] indica che si sta
definendo un array (si può
mettere prima o dopo al nome a
discrezione del programmatore)
•
new l'operatore new serve a
costruire l'oggetto
•Dimensione dice
quanti elementi contiene l'array
Dichiarazione
alternativa con inglobata l'inizializzazione degli elementi :
TipoDati[] Nome = {dato1,dato2,dato3,...daton};
L'accesso ai singoli elementi dell'array avviene nella maniera comune a molti linguaggi di programmazione ( C, C++, Pascal).
Nome[indice]
nota – è importante ricordarsi che il primo elemento di un array ha indice 0 e l'ultimo (numelementi-1).
Per scrivere nei vari elementi di un array si usa il simbolo di assegnazione :
Nome[indice] = valore compatibile con il tipo dell'array; esempio int pippo []=new int[20];//creato array con 10 elementi di tipo int String nomi []={“pippo”, “pluto”, “minnie”}; //creato array 3 elementi tipo String for(int i=0;i<pippo.length;i++);//genera gl'indici mediante la variabile i { /* il ciclo termina utilizzando il metodo length che definisce la lunghezza dell'array */ pippo[i]=100+i; //stampa dei valori inseriti nell'array System.out.println(“pippo con l'indice ”+i+” ha valore “+pippo[i]); } pippo[0] = 25; //assegna il valore intero 25 alla prima locazione pippo[12] = 33; //assegna il valore intero 33 alla locazione 12, cioè alla tredicesima locazione
pippo[32] = 12; //ERRORE : il valore dell'indice è troppo alto
pippo[15] = “ciao”; //ERRORE : il valore assegnato non è di tipo int ma è una stringa
for(int a=0;a<3;a++)
{
//stampa i tre nomi dell'array
System.out.println(“nome ”+a+” è “+nomi[a]);
}
Copia di array
Si può copiare un array con una semplice assegnazione:
array1 = array2;
ma dopo tale assegnazione entrambe le variabili fanno riferimento allo stesso array (STESSA AREA DI MEMORIA).
Questo
non è necessariamente un errore in Java.
Esiste in Java un
meccanismo di Garbage Collection (“raccolta spazzatura”):
in cui la memoria non utilizzata viene periodicamente recuperata
dalla JVM (Java Virtual Machine).
NOTA BENE: dato che ho un’unica area di memoria per array1 e array2 qualsiasi modifica fatta su una variabile si ripercuote sull’altra.
Esiste un metodo migliore per copiare un array in un altro: il metodo arraycopy della classe System.
System.arraycopy( sorgente, indice_sorgente, destinazione, indice_destinazione, numero);
sorgente
array da copiare
indice_sorgente posizione
di inizio copia di sorgente
destinazione array in
cui copiare
indice_ destinazione posizione di
inizio copia per l'array destinazione
numero numero
di elementi da copiare
Esempio: dati due array di numeri double, D1 e D2, copiare 3 elementi di D1 a partire dal secondo in D2 posizionandoli a partire dal quinto elemento di D2.
import java.util.Random; // per numeri casuali
class ArrayTest
{
public static void main (String args[]) {
int[] D1= new int[15];
int[] D2= new int[15];
double
x;
int n,i;
// generatore num. casuali(istanza della classe Random
Random myRandom = new Random(); for(i=0;i<15;i++) { // genera numeri random fra 0 e 9
x = myRandom.nextDouble() * 10.0;
n
= (int) x;
D1[i]=n;
// genera numeri random fra 100 e 1099
x =100.0 + myRandom.nextDouble() * 1000.0;
n
= (int) x;
D2[i]=n;
}
// Prima della copia for (i = 0; i < 15; i++) { System.out.println("D1[ "+i+"] = "+D1[i]+" D2[ "+i+"] = "+D2[i]); System.arraycopy(D1,1,D2,4,3); } // Dopo la copia for (i = 0; i < 15; i++) { System.out.println("D1[ "+i+"] = "+D1[i]+" D2[ "+i+"] = "+D2[i]); }
Confronto di array
Ricordare sempre la distinzione fra oggetti ed il contenuto degli oggetti. Date le seguenti definizioni
int[] a={1,2,3,4}; int[] b={1,2,3,4}; if (a==b) .....
risulta che il confronto (a==b) restituisce false
Se invece si considera
OGGETTO ≠ CONTENUTO DELL'OGGETTO
int[] a={1,2,3,4};
int[] b={1,2,3,4);
b=a;
if(a==b)
......
ora il confronto (a==b) vale true, ma in realtà significa solo che le variabili a e b rappresentano la stessa zona di memoria.
Per CONFRONTARE I CONTENUTI degli oggetti bisogna utilizzare un metodo apposito (definito dall'utente se non disponibile).
Ad esempio la classe String definisce i metodi
boolean equalsIgnoreCase(String s)
boolean
equals(String
s)
confrontano la stringa con s e
restituiscono true o false.
int compareTo(String s)
confronta
la stringa con s e restituisce:
•
0 se sono uguali
• N>0 se s e precedente (in ordine
alfabetico) • N<0 se è successiva.
Esempio
int
n;
String prima="altopiano"; String seconda="mare";
n
= seconda.compareTo(prima); // ora n e' maggiore di 0
Array multidimensionali
La dichiarazione di array multidimensionale è la naturale estensione di quanto giá visto
Definizione di un array bidimensionale:
TipoDati[][] Nome = new TipoDati[Dimens1][Dimens2];
Definizione di un array tridimensionale:
TipoDati[][][] Nome = new TipoDati[Dim1][Dim2][Dim3]; e cosí via per array N-dimensionali.
Alternativa :
TipoDati[][] Nome = {{dato1_1,d1_2},{d2_1,...d2_2}};
L'accesso avviene nella maniera seguente :
NomeVariabile[indice1][indice2]
NOTA: Un array multidimensionale è un array di array. È possibile definire array di dimensioni non uniformi.
Esempio
int Max_row=5; int[][] Matrice = new int[Max_row][]; /* l'oggetto Matrice non e' ancora utilizzabile, perche' non e' ancora definito il numero delle colonne */ for(i=0; i<= Max_row; i++)
Matrice[i]=
new int[n+1];
/*
l'oggetto Matrice e' ora utilizzabile */