Array!
Nome unico per collezione di valori tutti dello stesso tipo di dati!
Più di un tipo primitivo, meno di un oggetto!
metodi invocati con una notazione speciale!
comportamento simile ad oggetti se usati come argomenti o come tipi di
ritorno!
niente ereditarietà!
simili ad una classe Java non completamente implementata!
Adatti per cicli (in particolare, cicli for)!
!
!
1!
Creazione ed accesso!
Sintassi generale per la dichiarazione:!
Tipo_Base[] Nome_Array = new Tipo_Base[Lunghezza];
Esempi:
array di 80 caratteri:
char[] symbol = new char[80];
array di 7 reali:
double[] temperatura = new double[7];
Con questa sintassi creo un array di una certa lunghezza e contemporaneamente dichiaro
tante variabili quante indicate dalla lunghezza che saranno gli elementi degli array.!
Esempio: per l’array temperatura avrò dichiarato 7 variabili di
tipo double:temperatura[0], temperatura[1], temperatura[2],
temperatura[3], temperatura[4], temperatura[5], temperatura[6].
Gli elementi degli array vengono inizializzati di default ma
!andrebbero sempre inizializzati (per esempio con un ciclo for)
!
2!
Tipo di dato: array!
Un array può essere dichiarato ed inizializzato anche in
questo modo:!
!
double[] temperatura = {22.2,25.1,24.2,23.0,22.4,21.1,20.0};
Ciò di nuovo equivale a dichiarare 7 variabili di tipo reale
temperatura[0], temperatura[1], temperatura[2],
temperatura[3], temperatura[4], temperatura[5],
temperatura[6].
3!
Uso delle parantesi quadre!
Per creare un nome di tipo!
esempio: int[] intArrayName; crea una variabile (intArrayName) di tipo
"array di int” (int[])
• tipo int diverso da tipo array di int
• int[] sarà il tipo di intArrayName, non tipo dei dati inclusi nell’array (che comunque
sono di tipo int)!
Per creare un nuovo array!
esempio: numArray = new int[100];!
Per accedere ad uno specifico elemento dell’array!
esempio: System.out.println(numArray[3]);
!
!
4!
Terminologia di un array!
Nome
Indice
Valore di una variabile
indicizzata o elemento
temperatura[n + 2] = 32.0;
Variabile indicizzata o elemento
Indice:
- deve essere un letterale intero
- oppure un’espressione che ritorna un
int
L’indice permette di ‘cacolare’ il nome di ognuna di queste variabili
ATTENZIONE! Il primo indice di un array è 0.
5!
Nome di un array e locazioni di memoria!
L’identificatore temperatura è detto nome dell’array.!
Questo nome identifica una locazione di memoria contenente
l’indirizzo della locazione di memoria che contiene il primo
valore contenuto nell’array.!
Esempio:!
int numero = 6;
int[] numeroArrray = {6};
numero 6
.
numeroArray
numeroArray[0]
6
6!
Lunghezza di un array!
Il numero degli elementi contenuti un un array è detto lunghezza o
dimensione dell’array.!
La lunghezza di un array definisce il numero massimo di elementi che
l’array può contenere.!
E’ possibile conoscere la lunghezza di un array utilizzando il nome dell’array
seguito da un punto e dalla parola length
temperatura.length restituirà il valore 7!
Provando a cambiare la lunghezza di un array si genera un errore di
compilazione:!
temperatura.length = 10;
Cannot assign a value to a final variable length!
!
7!
Dominio di indicizzazione!
Indicizzazione
di array usa numerazione
a partire da 0!
primo
elemento: indice 0!
secondo elemento: indice 1!
n-esimo elemento: indice n-1!
ultimo elemento: indice length-1
Esempio:!
int[] scores = {97, 86, 92, 71};
Indice: 0
Valore: 97
1
86
2
92
3
71
8
Indicizzazione fuori dominio!
Ogni indice dell’array temperatura deve avere un
valore compreso tra 0 e 6 (length-1).!
Se si accede alla variabile indicizzata temperatura[n + 2] allora n + 2 deve avere uno
dei seguenti valori: 0, 1, 2, 3, 4, 5, 6.!
In caso contrario si dice che l’indice è fuori dominio ed
in fase di esecuzione l’interprete Java avvertirà del
problema con un messaggio di errore.!
Da osservare che in questo caso Java si differenzia da
C e C++ i quali non avvertono dell’errore di indice fuori
dominio in fase di esecuzione.!
9!
Array ed operatore ==!
int i;
a e b sono entrambi array
int[] a = new int[3];
di 3 elementi di tipo int
int[] b = new int[3];
a tutti gli elementi di a e b viene
for(i=0;i<a.length;i++)
assegnato il valore 0
a[i] = 0;
for(i=0;i<b.length;i++)
verifica se gli indirizzi di a e b sono uguali, non se i valori
b[i] = 0;
degli array sono uguali
if(b == a)
System.out.println("a equals b");
else
System.out.println("a does not equal b");
L'output di questo codice sarà a does not equal b perché gli indirizzi dei
due array non sono uguali
!
!
10!
Array ed operatore =!
int[] a = new int[3];
int[] b = new int[3];
for(int i; i < a.length; i++)
a[i] = i;
Non crea una copia dell'array a ma
trasforma b in un altro nome per l'array a
b = a;
System.out.println(a[2] + " " + b[2]);
a[2] = 10;
System.out.println(a[2] + " " + b[2]);!
Output:
2 2
10 10
!
!
Un valore cambiato in a
è lo stesso valore ottenuto con b
11!
Uguaglianza tra array!
Per verificare se due array
sono uguali bisogna
definire un metodo equals
che ritorna il valore true
se e solo se gli array hanno
la stessa lunghezza e tutti
gli elementi corrispondenti
sono uguali!
!
!
public boolean equals(int[] a, int[] b)
{
boolean match;
if (a.length != b.length)
match = false;
else
{
match = true;
int i = 0;
while (match && (i<a.length))
{
if (a[i] != b[i])
match = false;
i++;
}
}
return match;
}
12!
Array bidimensionali: matrici!
int[][] miaMatrice = {{1,2,3},{4,5,6}};
In questo modo ho dichiarato ed inizializzato la matrice 2x3:!
!
!
1 2 3
4 5 6
Oppure:!
int[][] miaMatrice = new int[2][3];
Con questa dichiarazione la matrice va successivamente
inizializzata con i valori desiderati.!
!
NB:!
miaMatrice.length fornisce il numero delle righe!
miaMatrice[0].length fornisce il numero delle colonne!
13!
Metodi ed array!
Una variabile di tipo array può essere
utilizzata come parametro formale di un
metodo oppure come tipo di ritorno.!
Es:!
Scrivere
un metodo per inizializzare i valori di
un array;!
Scrivere un metodo per sommare gli elementi
di un array;!
Scrivere un metodo per stampare i valori di
un array;!
14!
Es1:!
15!
Es2:!
Il metodo
raddoppiaArray
modifica l’array
ricevuta in input. Come posso
scrivere un metodo
che non modifichi
l’array di input? 16!
Ordinamento di array!
Ordinare
un elenco di elementi è un
compito molto frequente!
ordinare
numeri in modo crescente!
ordinare numeri in modo decrescente!
ordinare stringhe in modo alfabetico!
Vi
sono molti modi per ordinare un elenco!
Selection sort!
uno
dei più facili!
non il più efficiente, ma facile da capire e da
programmare!
17!
Algoritmo Selection Sort!
Per
ordinare un array di interi in modo crescente:!
cerca
nell'array il numero più piccolo e scambialo con il primo
elemento dell'array!
• la parte ordinata dell'array è ora il primo elemento, mentre quella non
ancora ordinata sono i rimanenti elementi!
cerca
nella parte non ordinata il numero più piccolo e
scambialo con il secondo elemento dell'array!
ripeti la ricerca e lo scambio fino a quando tutti gli elementi
sono al posto giusto!
• ogni iterazione aumenta di 1 la lunghezza della parte ordinata e
diminuisce di 1 quella della parte non ordinata!
18
Esempio!
a[0]
7
a[1]
6
a[2]
11
a[3]
17
a[4]
3
a[5]
15
a[6]
5
a[7]
19
a[8]
30
a[9]
14
7
6
11
17
3
15
5
19
30
14
3
6
11
17
7
15
5
19
30
14
3
6
11
17
7
15
5
19
30
14
3
5
11
17
7
15
6
19
3
5
11
17
7
15
6
19
30
14
3
5
6
17
7
15
11
19
30
14
30
14
19
Selection Sort: codice !
Metodo
Invocazione
Output
20!