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!