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!