Array
Un array e’ una struttura dati che contiene piu’ valori del
medesimo tipo.
La lunghezza di un array e’ stabilita quando l’array viene creato.
Dopo la sua creazione, un array ha una lunghezza fissa.
30/10/01
Array
1
Array
Un elemento di un array e’ uno dei valori contenuti nell’array e ad esso si accede
attraverso un indice che individua la sua posizione all’interno dell’array.
30/10/01
Array
2
Array
In Java gli array sono oggetti
I componenti di un array:
sono tutti dello stesso tipo
possono essere di tipo primitivo o riferimenti (reference) (altri oggetti,
inclusi array)
sono indicizzati tramite valori di tipo int (indice primo elemento: 0), con
controllo di validità degli indici a run-time
Esempio:
int[ ] a; /* dichiarazione */
a
null
/* anche int a[ ]; */
a = new int[3]; /* creazione */
a[0] = 1;
a
0
/* uso */
0
0
a
1
30/10/01
Array
0
0
3
Array
Nome del vettore
30/10/01
a[0]
-45
a[1]
6
a[2]
0
a[3]
72
a[4]
1543
a[5]
-89
a[6]
0
a[7]
62
a[8]
-3
a[9]
1
a[10]
6453
a[11]
78
Indice
dell’elemento nel
vettore
Array
4
Array
Ogni vettore conosce la propria lunghezza
a.length
Gli array sono definiti in due modi diversi:
int[ ] a, b; // ho definito due vettori di interi
int a[ ], b; // a è un vettore di interi, b è un intero
Gli array sono inizializzati in due modi diversi:
Con l’operatore new:
int[] a = new int[5]; // ho creato un vettore di 5 elementi
inizializzati a 0
In modo esplicito:
int[] a = { 1, 2, 4, 8, 16}; // inizializzo esplicitamente tutti i
valori
30/10/01
Array
5
Vettori
La lunghezza di un array è fissata al momento della sua creazione, e non può essere
cambiata…
a
int[ ] a = new int[3]
heap
... ma si può assegnare un nuovo array di diversa lunghezza all’array reference:
a
a = new int[5];
heap
30/10/01
Array
6
Esempio di gestione di un array
public class ArrayDemo
{
public static void main(String[] args)
{
int[] anArray; // dichiaro array di interi
anArray = new int[10]; // creo array di 10 interi
// assegno un valore ad ogni elemento dell’array e lo stampo
for (int i = 0; i < anArray.length; i++)
{
anArray[i] = i;
System.out.print(anArray[i] + " ");
}
System.out.println();
}
}
30/10/01
Array
7
Esempio vettore
1. /*
2.
* programma che riempie un vettore con interi
3.
* positivi di due cifre scelti a caso
4.
*/
5.
6. public class ProvaVettore {
7.
8.
public static void main(String[] args) {
9.
final int DIM = 10;
10.
int[] vet = new int[DIM];
11.
for(int i=0; i<vet.length; i++)
12.
vet[i] = (int) (Math.random()*100);
13.
for(int i=0; i<vet.length; i++)
14.
System.out.println("Elemento "+i+": "+vet[i]);
15.
}
16.
Elemento 0: 86
...
17. }
Elemento 1: 83
Elemento 5: 1
Elemento 2: 12
Elemento 6: 88
Elemento 3: 82
Elemento 7: 48
Elemento 4: 53
Elemento 8: 10
...
Elemento 9: 80
Esecuzioni diverse producono risultati diversi
30/10/01
Array
8
Argomenti del programma
Il metodo main ha un parametro che convenzionalmente si chiama args definito come
String[ ] (vettore di stringhe)
static public void main(String[] args) { . . . }
La variabile memorizza un vettore di stringhe corrispondenti ai parametri scritti sulla
riga di comando.
Supponiamo di avere la classe Echo e di richiamarla con la riga di comando:
% java Echo Tizio, Caio
In questo caso args memorizza 2 parole:
ad args[0] è associato “Tizio,”
ad args[1] è associato “Caio”
30/10/01
Array
9
Programma echo
1. /*
2.
* programma che stampa tutti i parametri
3.
*
4.
* comando echo
5.
*/
6. public class Echo {
7.
8.
public static void main(String[] args) {
9.
for(int i=0; i<args.length; i++)
10.
System.out.print(args[i]+' ');
11.
System.out.print('\n');
12.
}
13.
14. }
E:\ Java\source\Echo>java Echo uno due tre
uno due tre
E:\Java\source\Echo>
30/10/01
Array
10
Esempio vettore
1. /*
2.
* programma che riempie un vettore con interi
3.
* positivi di due cifre scelti a caso
4.
* la dimensione del vettore viene data come parametro
5.
*/
6.
7. public class ProvaVettore {
8.
9.
public static void main(String[] args) {
10.
int dim = Integer.parseInt(args[0]);
11.
int[] vet = new int[dim];
12.
for(int i=0; i<vet.length; i++)
13.
vet[i] = (int) (Math.random()*100);
14.
for(int i=0; i<vet.length; i++)
15.
System.out.println("Elemento "+i+": "+vet[i]);
16.
}
17.
18. }
30/10/01
Array
11
Esempio vettore
E:\ Java\source\Vettori>java ProvaVettore 3
Elemento 0: 83
Elemento 1: 53
Elemento 2: 18
E:\Java\source\Vettori>
E:\Java\source\Vettori\>java ProvaVettore
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException
at ProvaVettore.main(ProvaVettore.java:4)
E:\Java\source\Vettori\>
30/10/01
Array
12
Esempio vettore
1. public class ProvaVettore {
2.
3.
public static void main(String[] args) {
4.
if(args.length==0) {
5.
System.err.println(
6.
“uso: java ProvaVettore <dim-vettore>”);
7.
System.exit(1);
8.
}
9.
int dim = Integer.parseInt(args[0]);
10.
int[] vet = new int[dim];
11.
for(int i=0; i<vet.length; i++)
12.
vet[i] = (int) (Math.random()*100);
13.
for(int i=0; i<args.length; i++)
14.
System.out.println("Elemento "+i+": "+vet[i]);
15.
}
16.
17. }
E:\Java\source\Vettori\>java ProvaVettore
uso: java ProvaVettore <dim-vettore>
E:\Java\source\Vettori\>
30/10/01
Array
13
Esempio vettore
1. public class ProvaVettore {
2.
3.
public int[] v;
4.
5.
/**
6.
metodo costruttore crea il vettore
7.
e lo riempie
8.
ha bisogno come parametro della dimensione
9.
*/
10.
public ProvaVettore(int dim) {
11.
v = new int[dim];
12.
for(int i=0; i<dim; i++)
13.
v[i] = (int) (Math.random()*100);
14.
}
15.
30/10/01
Array
14
Esempio vettore
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
30/10/01
/**
il metodo trova la posizione del
valore massimo nel vettore
*/
public int massimo() {
int ind=0;
for(int i=1; i<v.length; i++)
if(v[i]>v[ind]) ind = i;
return ind;
}
Array
15
Esempio vettore
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40. }
public static void main(String[] args) {
if(args.length==0) {
System.err.println(
"uso: java ProvaVettore <dim-vettore>");
System.exit(1);
}
int dim = Integer.parseInt(args[0]);
ProvaVettore vet = new ProvaVettore(dim);
int max = vet.massimo();
System.out.println(
"il massimo e' l'elemento "+max+
" di valore "+vet.v[max]);
}
E:\Java\source\Vettori\>java ProvaVettore 6
il massimo e' l'elemento 5 di valore 82
E:\Java\source\Vettori\>
30/10/01
Array
16
Riferimenti e tipi primitivi
30/10/01
Array
17
// classe di test della classe Punto2D
public class testRiferimenti{
public static void main(String[] args) {
Punto2D p1 = new Punto2D(3, 2);
Punto2D p2 = p1;
System.out.println(" p1 = " + p1); System.out.println(" p2 = " + p2);
p1.sposta(2, 2);
System.out.println("Sposto p1 di 2, 2");
System.out.println(" p1 = " + p1); System.out.println(" p2 = " + p2);
p2.sposta(-2, -2);
System.out.println("Sposto p2 di -2, -2");
System.out.println(" p1 = " + p1); System.out.println(" p2 = " + p2);
int a1 = 2;
int a2 = a1;
System.out.println(" a1 = " + a1); System.out.println(" a2 = " + a2);
a1 += 2;
System.out.println("Incremento a1 di 2");
System.out.println(" a1 = " + a1); System.out.println(" a2 = " + a2);
a2 -= 2;
System.out.println("Decremento a2 di 2");
System.out.println(" a1 = " + a1); System.out.println(" a2 = " + a2);
}
}
Riferimenti e tipi primitivi
1. /** new restituisce un riferimento ad un oggetto, non l’oggetto stesso (in
L’operatore
2.
la classe
Studente
mi permette di
termini*tradizionali
un indirizzo
di memoria)
3.
* memorizzare un intero che rappresenta il voto
Le
4.
*/ variabili quindi memorizzano riferimenti, per utilizzare i singoli si utilizza
l’operatore
“.” (ma
il discorso{vale anche per I metodi)
5. public
class
Studente
6.
7.
public int voto;
8.
9.
public String toString() {
10.
return “voto = ” + voto;
11.
}
12.
13. }
30/10/01
Array
19
Riferimenti e tipi primitivi
1. public
class
testStudente
{ ad un oggetto, non l’oggetto stesso (in
L’operatore
new
restituisce
un riferimento
2.
termini tradizionali un indirizzo di memoria)
3.
static Studente a; // viene inizializzato a null
Le
variabili
quindi memorizzano riferimenti, per utilizzare i singoli si utilizza
4.
l’operatore
(ma il discorso
vale anche per I metodi)
5.
public“.”static
void main(String[]
args) {
6.
System.out.println(a.toString());
7.
}
8.
Exception in thread "main"
9. }
java.lang.NullPointerException
at testStudente.main(testStudente.java:6)
30/10/01
Array
20
Riferimenti e tipi primitivi
1. public
class
testStudente
{ ad un oggetto, non l’oggetto stesso (in
L’operatore
new
restituisce
un riferimento
2.
termini tradizionali un indirizzo di memoria)
3.
static Studente a; // viene inizializzato a null
Le
variabili
quindi memorizzano riferimenti, per utilizzare i singoli si utilizza
4.
l’operatore
(ma il discorso
vale anche per I metodi)
5.
public“.”static
void main(String[]
args) {
6.
a = new Studente(); // val è inizializzato a 0
7.
a.voto = 25;
8.
// applico il metodo toString all’oggetto a
9.
System.out.println(a.toString());
10.
}
11.
voto = 25
12. }
new crea lo spazio di memoria necessario
per memorizzare i dati legati a Studente a e
li inizializza a 0
30/10/01
Array
21
Riferimenti e tipi primitivi
1. public
class
testStudente
{ ad un oggetto, non l’oggetto stesso (in
L’operatore
new
restituisce
un riferimento
2.
termini tradizionali un indirizzo di memoria)
3.
static Studente a, b;
Le
variabili
quindi memorizzano riferimenti, per utilizzare i singoli si utilizza
4.
l’operatore
(ma il discorso
vale anche per I metodi)
5.
public“.”static
void main(String[]
args) {
6.
a = new Studente ();
7.
a.voto = 25;
8.
b = a;
9.
System.out.println(a.toString());
10.
System.out.println(b.toString());
11.
}
12.
voto = 25
13. }
voto = 25
30/10/01
Array
22
Riferimenti e tipi primitivi
1. public
class
testStudente
{ ad un oggetto, non l’oggetto stesso (in
L’operatore
new
restituisce
un riferimento
2.
termini tradizionali un indirizzo di memoria)
3.
static Studente a, b;
Le
variabili quindi
memorizzano
riferimenti, per utilizzare i singoli si utilizza
4.
static
int v1,
v2;
l’operatore “.” (ma il discorso vale anche per I metodi)
5.
6.
public static void main(String[] args) {
7.
a = new Studente ();
8.
a.voto = 25;
9.
b = a;
10.
v1 = 4;
11.
v2 = v1;
12.
v1 = 3;
13.
a.voto = 30;
14.
System.out.println(“v1 = ”+v1+“ v2 = ”+v2);
15.
System.out.println(a.toString());
16.
System.out.println(b.toString());
17.
}
v1 = 3 v2 = 4
18.
voto = 30
19. }
voto = 30
30/10/01
Array
23
Array di oggetti
class Automobile {
public int targa;
public int velocità;
….
}
….
Automobile[ ] a=new Automobile[3];
a
heap
a[2].targa
30/10/01
Array
24
Array di oggetti
Gli elementi di un array possono essere riferimenti a oggetti.
La seguente dichiarazione riserva spazio per memorizzare 25 riferimenti a oggetti di tipo
String:
String[] words = new String[25];
Esso non crea gli oggetti String stessi
Ogni oggetto memorizzato in un array deve essere istanziato separatamente.
30/10/01
Array
25
Array di oggetti
Gli oggetti possono avere degli array come variabili di istanza.
Quindi, e’ possibile creare strutture dati abbastanza complesse in modo semplice
usando array e oggetti.
Il progettista del software deve attentamente determinare una organizzazione dei dati e
degli oggetti che risulta piu’ adatta al tipo di problema e alla situazione.
30/10/01
Array
26
Array di array
short [ ][ ] a;
short a[ ][ ];
/* array di array di short */
/* equivalente */
a
a = new short[3][2];
a[2][0]
heap
a
a = new short[3][ ];
null null
null
heap
30/10/01
Array
27
Array bidimensionali
Un array monodimensionale memorizza una semplice lista di valori.
Un array bidimensionale puo’ essere pensato come una tabella di valori, disposti in
righe e colonne.
L’elemento di un array bidimensionale viene individuato da due indici.
Piu’ precisamente, un array bidimensionale in Java e’ un array i cui elementi sono a loro
volta degli array.
30/10/01
Array
28
Array multidimensionali
Un array puo’ avere un numero qualsivoglia di dimensioni, in questo caso si parla di
array multidimensionale.
Ogni dimensione e’ a sua volta un array caratterizzato da una propria lunghezza
costante (length).
Poiche’ ogni dimensione e’ un array di riferimenti ad array, gli array di una dimensione
possono essere di differenti lunghezze.
30/10/01
Array
29
Array come parametri
Un intero array puo’ essere passato come parametro ad un metodo.
Come per ogni altro oggetto, viene passato al metodo il riferimento all’array il cui valore
viene copiato nel parametro formale del metodo.
Cambiando un elemento di un array nel metodo, viene alterato il valore originale.
Il singolo elemento di un array puo’ essere passato ad un metodo e seguira’ le regole di
passaggio dei parametri di un elemento di quel tipo.
30/10/01
Array
30