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