Fondamenti di informatica
Oggetti e Java
Luca Cabibbo
Array
Capitolo 19
febbraio 2004
1
Array
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Il problema degli studenti da promuovere
Si consideri il seguente “problema degli studenti da promuovere”
 i venti studenti di un corso hanno svolto una prova di profitto,
e ciascuno studente ha ricevuto una votazione in decimi
 il docente del corso ha deciso di promuovere gli studenti la cui
votazione è non inferiore ai due terzi del voto medio ottenuto
dagli studenti alla prova d’esame
 si vuole scrivere un’applicazione che legge il nome e la
votazione di ciascuno dei venti studenti e stampa l’elenco dei
nomi degli studenti da promuovere, con le rispettive votazioni
2
Array
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Il problema degli studenti da promuovere
Inserisci i nomi e le votazioni dei venti studenti
Studente 1: Rossi 8.1
Studente 2: Verdi 3.2
Studente 3: Bianchi 5.2
Studente 4: Gialli 5.6
...
Studente 20: Neri 8.5
La media delle votazioni è 7.65
La soglia per la promozione è 5.12
Gli studenti promossi sono:
Rossi 8.1
Bianchi 5.2
Gialli 5.6
...
Neri 8.5
3
Array
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Una prima soluzione al problema degli studenti
/* nomi degli studenti */
String nome1, nome2, ..., nome20;
/* votazioni ricevute dagli studenti */
double voto1, voto2, ..., voto20;
double sommaVoti;
// somma dei voti
double soglia;
// soglia per la promozione
... stampa un messaggio ...
... segue ...
questi puntini non sono corretti
4
Array
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Una prima soluzione al problema degli studenti
/* leggi nomi e votazioni dei venti
/* leggi il nome e la votazione del
nome1 = Lettore.in.leggiString();
voto1 = Lettore.in.leggiDouble();
/* leggi il nome e la votazione del
nome2 = Lettore.in.leggiString();
voto2 = Lettore.in.leggiDouble();
...
/* leggi il nome e la votazione del
nome20 = Lettore.in.leggiString();
voto20 = Lettore.in.leggiDouble();
studenti */
primo studente */
secondo studente */
ventesimo studente */
/* calcola la soglia per la promozione */
sommaVoti = voto1 + voto2 + ... + voto20;
soglia = (2./3.) * (sommaVoti/20);
... segue ...
5
questi puntini non sono corretti
Array
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Una prima soluzione al problema degli studenti
/* stampa l'elenco degli studenti da promuovere */
... stampa un messaggio ...
/* verifica se il primo studente è stato promosso */
if (voto1 >= soglia)
System.out.println(nome1 + " " + voto1);
/* verifica se il secondo studente è stato promosso */
if (voto2 >= soglia)
System.out.println(nome2 + " " + voto2);
...
/* verifica se il ventesimo studente è stato promosso */
if (voto20 >= soglia)
System.out.println(nome20 + " " + voto20);
questi puntini non sono corretti
6
Array
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Caratteristiche del problema degli studenti
Due caratteristiche fondamentali – comuni a molti problemi
 vanno gestiti degli insiemi di variabili omogenee
 per i nomi e per i voti degli studenti
 in ciascun insieme di variabili omogenee, per ciascun
elemento devono essere effettuate le stesse operazioni
 ciascuna votazione deve essere letta e poi acceduta due o
tre volte
 ciascun nome deve essere letto e poi eventualmente
acceduto
Gli array sono uno strumento per gestire informazioni con queste
caratteristiche
7
Array
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Array
Un array è una collezione finita di variabili di uno stesso tipo
(elementi), posto in corrispondenza biunivoca con un altro
insieme finito (indici)
 in un array, ciascun elemento è individuato dal nome
dell’array insieme all’indice associato all’elemento
monthName
indici per
l’array
monthName
8
gennaio
January
febbraio
February
marzo
March
aprile
April
novembre
November
dicembre
December
Array
l’array monthName
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Array in Java
In Java, un array è una sequenza finita di variabili di uno stesso
tipo, posto in corrispondenza biunivoca con un intervallo iniziale e
finito dei numeri naturali
 il numero di elementi di un array è la lunghezza (o
dimensione) dell’array
 l’indice di ciascun elemento in un array è un numero naturale
 il primo elemento ha indice 0
 in un array lungo N, l’ultimo elemento ha indice N–1
In Java, un array è un oggetto, a cui è possibile accedere
mediante un suo riferimento e l’operatore [ ]
9
Array
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Un esempio di array in Java
L’array monthName, composto da dodici elementi String
0
January
1
February
2
March
3
April
10
November
11
December
monthName

10
l’espressione monthName[0] permette di accedere al primo
elemento dell’array, la stringa "January"
Array
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Uso di array
In Java gli array sono oggetti istanza, e la loro gestione presenta
alcuni aspetti simili a quelli della gestione degli altri oggetti istanza
 se si vuole usare un array bisogna
 dichiarare una variabile per memorizzare il riferimento
all’array
 creare l’array
 accedere agli elementi dell’array mediante l’operatore [ ]
11
Array
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Dichiarazione di variabili array e tipi array
Per usare un array i cui elementi sono di un tipo T bisogna
dichiarare una variabile di tipo T[ ]
String[] nomi;
double[] voti;
// nomi degli studenti
// votazioni ricevute dagli studenti
Tipi array
 se T è un tipo, l’espressione T[ ] denota un tipo riferimento,
chiamato tipo array di elementi di tipo T (array di T)
 le variabili di tipo array (o variabili array) sono dunque
variabili riferimento
12
Array
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Creazione di array
Per creare un array composto da N elementi di tipo T si deve
usare l’espressione new T[N]
/* crea l'array per i nomi degli studenti */
nomi = new String[20];
/* crea l'array per i voti degli studenti */
voti = new double[20];
13
Array
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Accesso a un array
L’accesso a un elemento di un array avviene scrivendo
 il riferimento all’array
 una espressione intera, che specifica l’indice dell’elemento da
accedere, racchiusa tra parentesi quadre [ e ]
 l’indice deve essere un indice valido per l’array
 ArrayIndexOutOfBoundsException
/* leggi nomi e votazioni degli studenti */
for (i=0; i<20; i++) {
/* leggi nome e votazione dell'i-esimo studente */
nomi[i] = Lettore.in.leggiString();
voti[i] = Lettore.in.leggiDouble();
}
/* calcola la somma dei voti */
sommaVoti = 0;
for (i=0; i<20; i++)
sommaVoti += voti[i];
14
Array
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Il problema degli studenti da promuovere
final int NUMERO_STUDENTI = 20; // numero degli studenti
String[] nomi;
// nomi degli studenti
double[] voti;
// votazioni ricevute dagli studenti
int i;
// indice per la scansione
// degli array nomi e voti
double sommaVoti;
// somma dei voti
double soglia;
// soglia per la promozione
... stampa un messaggio ...
/* creazione degli array per gli studenti */
/* crea l'array per i nomi degli studenti */
nomi = new String[NUMERO_STUDENTI];
/* crea l'array per i voti degli studenti */
voti = new double[NUMERO_STUDENTI];
... segue ...
15
Array
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Il problema degli studenti da promuovere
/* leggi nomi e votazioni degli studenti */
for (i=0; i<NUMERO_STUDENTI; i++) {
/* leggi nome e votazione dell'i-esimo studente */
nomi[i] = Lettore.in.leggiString();
voti[i] = Lettore.in.leggiDouble();
}
/* calcola la soglia per la promozione */
sommaVoti = 0;
for (i=0; i<NUMERO_STUDENTI; i++)
sommaVoti += voti[i];
soglia = (2./3.) * (sommaVoti/NUMERO_STUDENTI);
/* stampa l'elenco degli studenti da promuovere */
... stampa un messaggio ...
for (i=0; i<NUMERO_STUDENTI; i++) {
/* verifica se l'i-esimo studente è stato promosso */
if (voti[i] >= soglia)
System.out.println(nomi[i] + " " + voti[i]);
}
16
Array
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Lunghezza di un array
La lunghezza (dimensione) di un array è il numero di elementi
dell’array
 la lunghezza di un array viene fissata al momento della sua
creazione, e non può essere più cambiata
 è possibile accedere alla lunghezza di un array mediante la
variabile length e l’espressione riferimento-array . length
Esempio
 crea un array di interi e azzera i suoi elementi
int[] a;
// un array di interi
int i;
// indice per la scansione di a
/* creazione dell'array a */
a = new int[...];
// va indicata la dimensione di a
/* azzera gli elementi dell'array a */
for (i=0; i<a.length; i++)
a[i] = 0;
17
Array
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Array e metodi
I parametri formali di metodi e costruttori possono essere di tipo
array
 si noti che l’esecuzione di un metodo (o costruttore) può
modificare, come effetto collaterale, gli elementi di un array
che gli è stato passato come parametro
Anche il tipo di ritorno di un metodo può essere un tipo array
18
Array
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Letterali array
Un letterale array è la denotazione di un array di cui sono anche
specificati i valori iniziali per gli elementi
String[] animali;
animali = new String[] { "leone", "tigre", "orso" };

questo frammento di codice è equivalente a
String[] animali;
animali = new String[3];
animali[0] = "leone";
animali[1] = "tigre";
animali[2] = "orso";
19
Array
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Array e accesso posizionale
Gli array vanno normalmente elaborati elemento per elemento
 normalmente gli elementi di un array vengono acceduti in
modo posizionale, mediante l’ausilio di una o più variabili
indice
20
Array
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Somma degli elementi di un array
/* Calcola la somma degli elementi dell’array a. */
public static int somma(int[] a) {
// pre: a!=null
int i;
// indice per la scansione di a
int somma;
// somma degli elementi di a
/* scandisce e somma gli elementi di a */
somma = 0;
for (i=0; i<a.length; i++)
somma += a[i];
return somma;
}
21
Array
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Test del metodo int somma(int[] a)
/* Test del metodo int somma(int[] a). */
public static void testSomma() {
/* la somma degli elementi di un array vuoto è 0 */
System.out.println(somma(new int[] {}) + " (0)")
/* la somma degli elementi di un array composto
* da un solo elemento è uguale al valore
* dell'elemento */
System.out.println(somma(new int[] { 5 }) + " (5)")
/* somma degli elementi di un array con più elementi */
System.out.println(somma(new int[] { 1,2,3 }) + " (6)")
}
22
Array
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Visualizzazione degli elementi di un array
Normalmente non è possibile visualizzare gli elementi di un array
con una singola istruzione semplice
/* Visualizza sullo schermo gli elementi dell'array a. */
public static void visualizza(int[] a) {
// pre: a!=null
int i;
// indice per la scansione di a
/* visualizza gli elementi dell'array a,
* separandoli da spazi */
for (i=0; i<a.length; i++)
System.out.print(a[i] + " ");
/* poi va a capo */
System.out.println();
}
23
Array
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Calcolo del massimo elemento di un array
Scrivere un metodo di classe int massimo(int[] a) che calcola e
restituisce il valore del massimo elemento di un array di interi non
vuoto a
/* massimo in posizione intermedia */
System.out.println(
massimo( new int[] { 0, 5, 12, 7 } ) + " (12)");
/* massimo in prima posizione */
System.out.println(
massimo(new int[] { 3, 1, 2 }) + " (3)");
24
Array
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Calcolo del massimo elemento di un array di interi
/* Calcola il valore dell'elemento di
* valore massimo dell'array di interi a. */
public static int massimo(int[] a) {
// pre: a!=null && a.length>0 (ovvero, a non vuoto)
int massimo;
// il massimo di a
int i;
// indice per la scansione di a
/* il primo elemento di a viene scelto
* come massimo provvisorio */
massimo = a[0];
// OK, a non vuoto
/* scandisce a alla ricerca del massimo */
for (i=1; i<a.length; i++) {
/* massimo è il massimo tra gli
* elementi di indice 0, ..., i-1
*/
if (a[i] > massimo)
massimo = a[i];
/* massimo è il massimo tra gli
* elementi di indice 0, ..., i
*/
}
return massimo;
}
25
Array
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Verifica se un array è crescente
Scrivere un metodo boolean crescente(int[] a) che verifica se a
è ordinato in modo crescente
/* Verifica se l'array di interi a
* è ordinato in modo crescente. */
public static boolean crescente(int[] a) {
// pre: a!=null
boolean crescente;
// a è crescente
int i;
// indice per la scansione di a
/* verifica se a è ordinato in modo crescente */
crescente = true;
for (i=0; crescente && i<a.length-1; i++)
if (a[i] >= a[i+1])
crescente = false;
return crescente;
}

26
notare l’uso della variabile indice i
 variabili indice ed espressioni indice
Array
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Coppia di elementi uguali
Scrivere un metodo boolean coppiaUguali(int[] a) che verifica
se a contiene almeno una coppia di elementi uguali
/* Verifica se a contiene una coppia di elementi uguali. */
public static boolean coppiaUguali(int[] a) {
// pre: a!=null
boolean cu;
// a contiene una coppia
// di elementi uguali
int i, j;
// indici per la scansione di a
/* cerca una coppia di elementi uguali esaminando
* tutte le coppie di elementi distinti */
cu = false;
for (i=0; i<a.length; i++)
for (j=i+1; j<a.length; j++)
if (a[i]==a[j])
cu = true;
return cu;
}
27
Array
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Array paralleli
Un insieme di array paralleli è un insieme formato da due o più
array della stessa lunghezza, in cui gli elementi che occupano
una stessa posizione formano un gruppo correlato di dati
 un esempio di array paralleli è dato dagli array nomi e voti
nel problema degli studenti da promuovere
nomi
28
voti
0
Rossi
0
8.1
1
Verdi
1
3.2
2
Bianchi
2
5.2
3
Gialli
3
5.6
19
Neri
19
8.5
Array
dati sullo studente
Bianchi
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Clonazione di array
La clonazione è una operazione che ha lo scopo di creare un
oggetto uguale a un altro oggetto
 un clone di un array A è un array che contiene lo stesso
numero di elementi di A e i cui elementi sono uguali a quelli di
A di indice corrispondente
/* Crea una copia dell'array a. */
public static double[] clona(double[] a) {
// pre: a!=null
double[] c;
// clone di a
int i;
// indice per la scansione di a e c
/* crea c, della stessa lunghezza di a */
c = new double[a.length];
/* copia gli elementi di a in c */
for (i=0; i<a.length; i++)
c[i] = a[i];
/* restituisce il clone */
return c;
}
29
Array
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Uguaglianza tra array
/* Verifica se gli array a e b sono tra loro uguali. */
public static boolean uguali(int[] a, int[] b) {
// pre: a!=null && b!=null
int i;
// indice per la scansione di a e b
boolean uguali;
// a e b sono uguali
/* verifica se a e b sono uguali */
if (a.length!=b.length)
// sono sicuramente diversi
uguali = false;
else { // sono uguali se lo sono elemento per elemento
/* scandisce a e b alla ricerca di una differenza */
uguali = true;
for (i=0; uguali && i<a.length; i++)
if (a[i]!=b[i])
// sono diversi
uguali = false;
}
return uguali;
}
30
Array
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Elementi positivi di un array di interi
Si vuole risolvere il seguente problema
 dato un array A di interi, si vuole creare e calcolare un nuovo
array che contiene tutti e soli gli elementi positivi di A, nello
stesso ordine in cui occorrono in A


31
ad esempio, se A è il seguente array
2
-3
0
7
11
0
1
2
3
4
allora bisogna creare e restituire il seguente array
2
7
11
0
1
2
Array
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Elementi positivi di un array di interi
Il problema dei positivi può essere risolto come segue
 calcola il numero P di elementi positivi presenti nell’array A
 crea un array POS di interi di lunghezza P
 trascrivi nell’array POS gli elementi positivi di A, nello stesso
ordine in cui occorrono in A
32
2
-3
0
7
11
0
1
2
3
4
2
7
11
0
1
2
Array
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Elementi positivi di un array di interi
/* Calcola un nuovo array che contiene tutti e soli gli
* elementi di valore positivo di a,
* disposti nello stesso ordine in cui occorrono in a. */
public static int[] positivi(int[] a) {
// pre: a!=null
int p;
// numero degli elementi positivi di a
int[] pos;
// l'array dei positivi di a
int i;
// indice per la scansione di a
int j;
// indice per la scansione di pos
/* calcola il numero di elementi positivi di a */
p = 0;
for (i=0; i<a.length; i++)
if (a[i]>0)
p++;
... segue ...
33
Array
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Elementi positivi di un array di interi
... segue ...
/* crea l'array per i positivi */
pos = new int[p];
/* trascrivi in pos gli elementi positivi di a,
* nello stesso ordine in cui occorrono in a */
j = 0;
// j è l'indice in pos in cui va trascritto
// il prossimo elemento positivo di a
/* scandisce gli elementi di a,
* trascrivendo i positivi in pos */
for (i=0; i<a.length; i++)
if (a[i]>0) {
/* a[i] va trascritto in pos[j] */
pos[j] = a[i];
j++;
}
return pos;
}
34
Array
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Array e oggetti
Gli elementi di un array possono essere dei riferimento a oggetti
vs
v0
nome = Rossi
voto = 8.1
0 1 2 3
v1
nome = Verdi
voto = 3.2
19
v2
nome = Bianchi
voto = 5.2
v3
nome = Gialli
voto = 5.6
…
v19
nome = Neri
voto = 8.5
oggetto dati per lo
studente Bianchi
35
Array
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
La classe Valutazione
/* Un oggetto Valutazione rappresenta il nome
* di uno studente e la votazione che ha ricevuto. */
class Valutazione {
/* Il nome dello studente. */
private String nome;
/* La votazione ricevuta dallo studente. */
private double voto;
/* Crea una nuova Valutazione, dati nome e votazione. */
public Valutazione(String nome, double voto) {
this.nome = nome;
this.voto = voto;
}
/* Restituisce il nome dello studente. */
public String getNome() {
return nome;
}
/* Restituisce il voto ottenuto dallo studente. */
public double getVoto() {
return voto;
}
}
36
Array
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Il problema degli studenti
final int NUMERO_STUDENTI = 20; // numero degli studenti
Valutazione[] vs;
// valutazioni degli studenti
String nome;
// nome di uno studente
double voto;
// votazione ottenuta da uno studente
int i;
// indice per la scansione di vs
double sommaVoti;
// somma dei voti
double soglia;
// soglia per la promozione
/* crea l'array per le valutazioni degli studenti */
vs = new Valutazione[NUMERO_STUDENTI];
/* leggi nomi e votazioni dei cinque studenti */
... stampa un messaggio ...
for (i=0; i<NUMERO_STUDENTI; i++) {
/* leggi nome e votazione dell'i-esimo studente */
nome = Lettore.in.leggiString();
voto = Lettore.in.leggiDouble();
/* crea la valutazione per l'i-esimo studente */
vs[i] = new Valutazione(nome,voto);
}
37
Array
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Il problema degli studenti
/* calcola la soglia per la promozione */
sommaVoti = 0;
for (i=0; i<NUMERO_STUDENTI; i++)
sommaVoti += vs[i].getVoto();
soglia = (2./3.) * (sommaVoti/NUMERO_STUDENTI);
/* stampa l'elenco degli studenti da promuovere */
... stampa un messaggio ...
for (i=0; i<NUMERO_STUDENTI; i++) {
/* verifica se l'i-esimo studente è stato promosso */
if (vs[i].getVoto() >= soglia)
System.out.println(vs[i].getNome() + " " +
vs[i].getVoto());
}
38
Array
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Parametro del metodo main
/* Applicazione che visualizza gli argomenti
* della linea di comando. */
class Echo {
public static void main(String[] args) {
int i;
// indice per la scansione di args
System.out.print("Argomenti: ");
for (i=0; i<args.length; i++)
System.out.print("(" + args[i] + ") ");
System.out.println();
}
}
39
Array
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Ricerca sequenziale
Il problema della ricerca in un array
 dato un array a di elementi di tipo T e un valore chiave di tipo
T
 verificare se l’array a contiene un elemento uguale a chiave
 se a contiene almeno un elemento uguale a chiave, allora
deve essere calcolato e restituito l’indice di uno degli
elementi di a tra quelli uguali a chiave
 altrimenti, deve essere restituito il valore -1
40
Array
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Il problema della ricerca in un array
Nell’esecuzione di una operazione di ricerca in un array sono
possibili diverse situazioni



41
5
4
12
9
0
2
16
2
0
a
1
2
3
4
5
6
7
se la chiave è uguale a 16
 va restituito l’indice 6
se la chiave è uguale a 6
 va restituito il valore -1
se la chiave è uguale a 2
 può essere restituito indifferentemente 5 o 7
Array
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Ricerca sequenziale
/* Verifica se l’array a contiene un elemento uguale a
* chiave, e restituisce la posizione della prima
* occorrenza di chiave in a, oppure -1. */
public static int ricercaSequenziale(int[] a, int chiave) {
// pre: a!=null
int posizione;
// posizione di chiave in a
int i;
// indice per la scansione di a
/* scandisce gli elementi di a, alla ricerca della
* prima occorrenza di chiave in a */
posizione = -1;
for (i=0; posizione==-1 && i<a.length; i++)
if (a[i]==chiave)
posizione = i;
return posizione;
}
42
Array
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Ricerca binaria
Consideriamo il problema della ricerca in un array ordinato
 in particolare, ordinato in modo non decrescente
43
0
1
3
4
7
9
12
16
22
34
0
1
2
3
4
5
6
7
8
9
Array
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Spazio di ricerca
Gli algoritmi di ricerca sono normalmente basati su una strategia
di gestione degli elementi della collezione, relativa a una
partizione degli elementi della collezione in due insiemi
 un insieme è composto dagli elementi che sono sicuramente
diversi dalla chiave di ricerca
 l’altro insieme (chiamato spazio di ricerca) è composto dagli
elementi che potrebbero essere uguali alla chiave di ricerca
Lo spazio di ricerca varia in modo dinamico durante l’esecuzione
di un algoritmo di ricerca
44
Array
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Ricerca binaria
L’algoritmo di ricerca binaria per la ricerca in un array ordinato
 inizialmente lo spazio di ricerca è composto da tutti gli
elementi dell’array
 finché non è stato trovato un elemento dell’array uguale alla
chiave e comunque lo spazio di ricerca è non vuoto
 confronta la chiave con l’elemento centrale dello spazio di
ricerca
 se la chiave è uguale all’elemento centrale dello spazio di
ricerca, allora la ricerca termina con esito positivo
 se invece la chiave è maggiore dell’elemento centrale dello
spazio di ricerca, rimuovi dallo spazio di ricerca l’elemento
centrale e tutti quelli alla sua sinistra
 se invece la chiave è minore dell’elemento centrale dello
spazio di ricerca, rimuovi dallo spazio di ricerca l’elemento
centrale e tutti quelli alla sua destra
45
Array
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Ricerca binaria – successo
7
0
1
3
4
7
s=0
9
12
16
22
34
c=5
d=10
7
0
1
s=0
3
4
7
c=2
9
12
16
22
34
12
16
22
34
d=5
7
0
1
3
4
s=3
46
Array
7
9
c=4 d=5
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Ricerca binaria – fallimento
18
0
1
3
4
7
s=0
9
12
16
22
34
c=5
d=10
18
0
1
3
4
7
9
12
16
s=6
22
34
c=8
d=10
18
0
0
47
1
1
3
3
4
4
Array
7
7
9
9
12
16
22
s=6
c=7 d=8
12
16
22
34
34
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
s=d=8
Copyright © 2004 – The McGraw-Hill Companies srl
Metodo per la ricerca binaria
/* Ricerca chiave nell'array a ordinato in modo
* non descrescente, restituendo l'indice di un
* elemento di a uguale a chiave (oppure -1). */
public static int ricercaBinaria(int[] a, int chiave) {
// pre: a!=null && a è ordinato in modo non decrescente
int posizione;
// posizione di un elemento di a
// uguale a chiave, se esiste
int sinistra;
// indice del primo elemento dello
// spazio di ricerca
int destra;
// indice del primo elemento oltre
// lo spazio di ricerca
int centro;
// indice dell'elemento centrale dello
// spazio di ricerca
48
Array
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Metodo per la ricerca binaria
/* inizialmente lo spazio di ricerca comprende
* tutti gli elementi di a */
sinistra = 0;
destra = a.length;
/* cerca l'indice di un elemento di a uguale
* a chiave, se esiste, mediante la ricerca binaria */
posizione = -1;
while (posizione==-1 && sinistra<destra) {
centro = (sinistra+destra)/2;
if (a[centro]==chiave)
// trovato
posizione = centro;
else if (a[centro]>chiave) // continua a sinistra
destra = centro;
else
// continua a destra
sinistra = centro+1;
}
return posizione;
}
49
Array
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Fusione di sequenze ordinate
La fusione di due sequenze ordinate è una operazione che
 date due sequenze a e b ordinate in modo non decrescente
 costruisce una nuova sequenza s che contiene tutti gli
elementi di a e b ed è ordinata in modo non decrescente
a
5
12
26
34
s
b
6
8
5
6
8
12
21
26
34
21
Strategia per la fusione di sequenze ordinate
 seleziona gli elementi di s — uno alla volta, in sequenza
 il prossimo elemento di s viene scelto tra l’elemento più
piccolo di a e quello più piccolo di b tra quelli che non sono
ancora stati inseriti in s
50
Array
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Indici nella fusione di array
ia=1
a
5
12
26
34
s
b
6
8
5
6
8
is=3
21
ib=2
Gestione di un inserimento
ia=2
a
5
12
26
12
34
s
b
6
8
5
6
8
12
is=4
21
ib=2
51
Array
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Indici nella fusione di array
A un certo punto, tutti gli elementi di uno dei due array saranno
stati inseriti in s
ia=2
a
5
12
26
34
s
b
6
8
5
6
8
12
21
is=5
21
ib=3
52
Array
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Implementazione della fusione
/* Fonde gli array a e b ordinati in modo
* non decrescente in un nuovo array ordinato. */
public static int[] fusione(int[] a, int[] b) {
// pre: a!=null && b!=null &&
//
a e b ordinati in modo non decrescente
int[] s;
// risultato della fusione di a e b
int ia, ib, is;
// indici per a, b e s
/* inizializzazioni */
s = new int[a.length+b.length];
ia = 0;
ib = 0;
is = 0;
53
Array
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Implementazione della fusione
/* prima fase della fusione: inserisci da a e b */
while (ia<a.length && ib<b.length) {
/* inserisci in s
* il più piccolo tra a[ia] e b[ib] */
if (a[ia]<b[ib]) {
s[is] = a[ia];
ia++;
} else {
s[is] = b[ib];
ib++;
}
is++;
}
/* ora ia==a.length || ib==b.length */
54
Array
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl
Implementazione della fusione
/* seconda fase della fusione: inserisci da a o b */
/* inserisci da a */
while (ia<a.length) {
s[is] = a[ia];
ia++;
is++;
}
/* inserisci da b */
while (ib<b.length) {
s[is] = b[ib];
ib++;
is++;
}
/* ora la fusione è stata completata */
return s;
}
55
Array
Luca Cabibbo – Fondamenti di informatica: Oggetti e Java
Copyright © 2004 – The McGraw-Hill Companies srl