String - Dipartimento di Informatica e Automazione

Transcript

String - Dipartimento di Informatica e Automazione
Corso di Laurea Ingegneria Civile
Fondamenti di Informatica
Dispensa 16
Tipi riferimento e stringhe
Carla Limongelli
Maggio 2010
Definizione di metodi
1
Contenuti
 Tipi riferimento
 Stringhe e oggetti String
 Uso di variabili riferimento
 Uso di oggetti String
 Stringhe e tipi primitivi
• conversione da tipi primitivi a stringhe
• il metodo charAt
 Concatenazione di stringhe
 Confronto tra stringhe
 Riferimenti e uguaglianza
 Il letterale null
Tipi riferimento e stringhe
2
Tipi riferimento
I tipi riferimento sono tipi definiti in
corrispondenza a classi
• dal punto di vista dell’utente di un tipo riferimento (classe)
– il dominio è l’insieme dei possibili oggetti che possono essere istanziati dalla
classe
– le operazioni associate al tipo riferimento sono le operazioni (metodi) definite
dalla classe
• dal punto di vista del linguaggio di programmazione, ai tipi
riferimento possono essere applicati i seguenti operatori
– l’operatore new – per la creazione di un nuovo oggetto
– l’operatore . (operatore punto) – per l’invocazione di un metodo o l’accesso a
una variabile di un oggetto
– altri operatori saranno introdotti in capitoli successivi
È sempre possibile associare un tipo alle
espressioni riferimento
• ad esempio
– "calcolatore" è una espressione del tipo riferimento String
Tipi riferimento e stringhe
3
Stringhe e oggetti String
Una stringa è una sequenza finita di caratteri
• le stringhe sono un tipo di dati di uso molto comune –
consentono di rappresentare informazioni testuali e descrittive
Java supporta la gestione di stringhe attraverso
la classe String del package java.lang
• non da un tipo primitivo – una stringa non è un tipo di dati
elementare
• un oggetto String rappresenta una sequenza di caratteri
– una sequenza finita di caratteri dell’alfabeto Unicode
• gli oggetti String sanno eseguire operazioni utili per la loro
gestione
Tipi riferimento e stringhe
4
Stringhe e oggetti String
Il valore (o contenuto) di un oggetto String è la
stringa rappresentata da quell’oggetto
• ad esempio, il letterale "calcolatore" denota un oggetto String il
cui valore è la stringa calcolatore
"calcolatore" : String
calcolatore
• in questo diagramma, l’oggetto mostrato rappresenta la stringa
calcolatore
– non viene data nessuna indicazione sulla modalità interna di
rappresentazione della stringa
– gli oggetti String (così come altri oggetti) possono essere usati
conoscendone solo l’interfaccia ma non i dettagli implementativi
Tipi riferimento e stringhe
5
Letterali stringa
Un letterale String è una stringa racchiusa tra
doppi apici " e "
• ad esempio, "calcolatore"
• il valore di un letterale String è la stringa racchiusa tra apici
(apici esclusi)
• l’uso di un letterale String è equivalente alla creazione di un
oggetto di tipo String
– il letterale "calcolatore" è sostanzialmente equivalente a una espressione
della forma new String( ... )
• un letterale String è una espressione di tipo String
– ovvero, un letterale String è una espressione di tipo String — il cui valore è
il riferimento a un oggetto String
– ad esempio, "calcolatore" è il riferimento a un oggetto String
Java fornisce un supporto speciale (ovvero,
eccezionale) per gli oggetti String
• lo si capisce già dalla presenza dei letterali String
Tipi riferimento e stringhe
6
Uso di variabili riferimento
Essendo String il nome di una classe, è
possibile dichiarare variabili di tipo String
• si tratta di variabili riferimento
– una variabile riferimento permette di memorizzare il riferimento a un oggetto
– ma non il ―valore‖ di un oggetto – che è memorizzato in un’altra area di
memoria
String stagione;
stagione = "estate";
stagione
"estate" : String
String
System.out.println(stagione);
// visualizza estate
Tipi riferimento e stringhe
7
Variabili riferimento e assegnazioni
Se a una variabile riferimento (che referenzia già un
oggetto A) viene assegnato il riferimento a un altro
oggetto B
 l’oggetto A non viene sostituito dall’oggetto B
 il riferimento all’oggetto A memorizzato dalla variabile viene sostituito
dal riferimento all’oggetto B
 l’oggetto A continua ad esistere
String stagione;
stagione = "estate";
stagione
stagione = "inverno";
"estate" : String
String
stagione
"estate" : String
String
"inverno" : String
Tipi riferimento e stringhe
8
Un oggetto può essere referenziato da
più variabili
È possibile che un oggetto sia
contemporaneamente referenziato da più variabili
String s, t;
s = "estate";
t = s; // copia in t il riferimento memorizzato da s
s
"estate" : String
String
t
String
Tipi riferimento e stringhe
9
Le variabili sono indipendenti
Le variabili sono indipendenti
• una assegnazione a una variabile modifica il valore di una sola
variabile
String s, t;
s = "estate";
t = s;
// copia in t il riferimento
// memorizzato da s
t = "inverno";
s
"estate" : String
String
t
"inverno" : String
String
Tipi riferimento e stringhe
10
Uso di oggetti String
Che cosa è un oggetto String?
• dal punto di vista del contenuto informativo, un oggetto String
rappresenta una stringa
• dal punto di vista comportamentale, un oggetto String è un
oggetto che sa eseguire un certo numero di operazioni
– un oggetto String sa eseguire operazioni per la manipolazione di se stesso
La classe String è usata per rappresentare il
tipo delle stringhe
• un tipo è
– un insieme di elementi — l’insieme delle stringhe, in questo caso
– un insieme di operazioni, per la manipolazione degli elementi di un tale
insieme
Vengono ora descritte alcune operazioni sulle
stringhe
Tipi riferimento e stringhe
11
Il metodo int length()
Il metodo int length() della classe String
• calcola la lunghezza della stringa
• la lunghezza di una stringa è il numero di caratteri della
sequenza che costituisce la stringa
Ad esempio, l’espressione
"automobile".length() vale 10
Tipi riferimento e stringhe
12
La stringa vuota
Una stringa vuota è una sequenza vuota di
caratteri
• la stringa vuota è un oggetto String di lunghezza zero
• la stringa vuota è denotata dal letterale ""
• l’espressione "".length() vale 0
Tipi riferimento e stringhe
13
Il metodo String concat(String x)
 La concatenazione è l’operazione che a partire da due
stringhe S e T calcola una nuova stringa il cui valore è
dato dalla sequenza di caratteri di S seguita dalla
sequenza di caratteri di T
• il metodo String concat(String x) della classe String
implementa l’operazione di concatenazione di stringhe
• crea e restituisce un nuovo oggetto String composto dai caratteri
della stringa su cui il metodo viene invocato, seguiti dai caratteri
della stringa argomento x
 Ad esempio
String s, t, u;
s = "auto";
t = "mobile";
u = s.concat(t);
/* u vale (referenzia) "automobile" */
Tipi riferimento e stringhe
14
Concatenazione di stringhe
String s, t, u;
s = "auto";
t = "mobile";
s
"auto" : String
String
t
"mobile" : String
String
u
String
u = s.concat(t);
/* u vale (referenzia) "automobile" */
u
"automobile" : String {new}
String
Tipi riferimento e stringhe
15
Posizione dei caratteri in una stringa
Le posizioni dei caratteri di una stringa sono
numerate da sinistra verso destra
• il carattere più a sinistra (il primo) ha posizione 0
• in una stringa composta da N caratteri, il carattere più a destra
(l’ultimo) ha posizione N – 1
a u t o m o b i l e
0 1 2 3 4 5 6 7 8 9
• in generale, l’i-esimo carattere di una stringa occupa la posizione
i–1
Tipi riferimento e stringhe
16
Il metodo String substring (int inizio, int
fine)
Il metodo String substring(int inizio, int fine)
della classe String
• (crea e) restituisce un nuovo oggetto String composto dai
caratteri della stringa su cui il metodo è stato invocato che
occupano le posizioni tra inizio (inclusa) e fine (esclusa)
– detto in altro modo, la stringa restituita comprende i caratteri tra le posizioni
inizio e fine–1 (estremi inclusi)
• ad esempio
String s, t;
s = "automobile";
t = s.substring(2,6);
/* t vale "tomo" */
Tipi riferimento e stringhe
17
Il metodo String substring(int inizio)
Il metodo String substring(int inizio) della
classe String
• (crea e) restituisce un nuovo oggetto String che consiste dei
caratteri della stringa su cui il metodo viene invocato compresi tra
quello di posizione inizio e l’ultimo carattere della stringa
(incluso)
• ad esempio
String s, t;
s = "automobile";
t = s.substring(4);
/* t vale "mobile" */
Tipi riferimento e stringhe
18
Pre-condizioni delle operazioni
substring
Il metodo String substring(int inizio) è soggetto
alle seguenti pre-condizioni
• inizio deve essere maggiore o uguale a zero
• inizio deve essere minore o uguale alla lunghezza della stringa -1
Il metodo String substring(int inizio, int fine),
oltre alle precedenti, è soggetto anche alle
seguenti pre-condizioni
• fine deve essere minore o uguale alla lunghezza della stringa
• inizio deve essere minore o uguale a fine
In caso di violazione delle pre-condizioni
• viene generato un errore al tempo di esecuzione di tipo
IndexOutOfBoundsException
– ovvero di tipo indice fuori dai limiti
Tipi riferimento e stringhe
19
Il metodo int indexOf(char car)
Il metodo int indexOf(char car) della classe
String
• verifica se la stringa su cui il metodo viene invocato contiene il
carattere car
– restituisce la prima posizione in cui occorre il carattere car
– oppure restituisce il valore –1 — una posizione non valida
Ad esempio
"automobile".indexOf('m') vale 4
"automobile".indexOf('o') vale 3
"automobile".indexOf('M') vale –1
Tipi riferimento e stringhe
20
Il metodo int indexOf(String s)
Il metodo int indexOf(String s) della classe
String
• verifica se la stringa su cui il metodo viene invocato contiene la
sottostringa s
– una sottostringa di una stringa T è una sequenza di caratteri consecutivi
della stringa T
– esempi di sottostringhe di "automobile" sono "auto", "mobile", "tomo" ,
""
– esempi di stringhe che non sono sottostringhe di "automobile" sono "aule"
e "autoobile"
• restituisce la prima posizione in cui inizia una occorrenza della
stringa s — oppure il valore –1
Ad esempio
"automobile".indexOf("auto") vale 0
"automobile".indexOf("tomo") vale 2
"mamma".indexOf("ma") vale 0 – e non 3
"automobile".indexOf("aule") vale –1
Tipi riferimento e stringhe
21
Gli oggetti String sono immutabili
Un oggetto String rappresenta una stringa
costante, immutabile
• dopo la creazione, il valore di un oggetto String non può essere
modificato
– l’unico modo di interagire con un oggetto String è mediante i metodi della
classe String
– nessun metodo della classe String modifica l’oggetto su cui il metodo viene
invocato
Tipi riferimento e stringhe
22
Visualizzazione e lettura di stringhe
Per visualizzare una stringa s sullo schermo
System.out.println(s);
Per leggere una stringa dalla tastiera
s = Lettore.in.leggiLinea();
Tipi riferimento e stringhe
23
Conversione da tipi primitivi a stringhe
Si supponga di voler calcolare, a partire da un
intero N, una stringa il cui valore è il letterale per
N
• la conversione da tipi primitivi a stringhe è realizzata mediante un
certo numero di metodi di classe della classe String
– di nome valueOf
– ciascuno di questi metodi valueOf accetta come argomento il valore di un
certo tipo primitivo e restituisce un valore String che è la rappresentazione
dell’argomento sotto forma di stringa
Ad esempio
String.valueOf(16) vale "16"
String.valueOf('a') vale "a"
Tipi riferimento e stringhe
24
Il metodo charAt
Il metodo char charAt(int posizione) della classe
String permette di estrarre da una stringa il
carattere che occupa una certa posizione
• ad esempio
"automobile".charAt(0) vale 'a'
"automobile".charAt(2) vale 't'
Il metodo charAt non può essere espresso in
termini del metodo substring
• ad esempio "automobile".substring(0,1) vale "a" (una stringa)
e non 'a' (un carattere)
• il metodo char charAt(int posizione) costituisce l’unico modo
per convertire una stringa composta da un solo carattere a un
carattere
Tipi riferimento e stringhe
25
Il metodo char charAt(int posizione)
Nell’invocare il metodo char charAt(int posizione) usando
come destinatario una stringa s
• il valore di posizione deve essere una posizione valida all’interno
della stringa s
– ovvero, deve valere posizione>=0 && posizione<s.length()
Nel caso in cui la pre-condizione dell’operazione charAt
non sia rispettata
• viene generato un errore al tempo di esecuzione, mediante una
eccezione di tipo IndexOutOfBoundsException
L’argomento posizione del metodo charAt viene
considerato un indice nell’accesso a un carattere della
stringa
• una posizione all’interno della stringa ―indica‖ il carattere che
occupa quella posizione
Tipi riferimento e stringhe
26
Concatenazione di stringhe
La concatenazione tra stringhe è una
operazione di uso frequente
• le stringhe possono essere concatenate usando l’operatore + di
concatenazione
• ad esempio, "auto" + "mobile" vale "automobile"
– l’espressione "auto" + "mobile" è essenzialmente equivalente a
"auto".concat("mobile")
• in questo caso, entrambi gli operandi dell’operatore di
concatenazione sono stringhe, e il risultato è una stringa
L’operatore di concatenazione tra stringhe che
è un operatore speciale per la manipolazione di
oggetti String
• in Java non sono definiti operatori speciali per nessun’altra
classe
Tipi riferimento e stringhe
27
Concatenazione e conversioni implicite
L’operatore + di concatenazione è anche in
grado di effettuare conversioni implicite da tipi
primitivi a stringhe
Ad esempio, se si vuole concatenare la stringa
"prezzo=" con la stringa che rappresenta l’intero
10.99
• è possibile scrivere l’espressione "prezzo=" + 10.99
– che vale "prezzo=10.99"
• l’espressione "prezzo=" + 10.99 è essenzialmente equivalente a
"prezzo=" + String.valueOf(10.99)
Tipi riferimento e stringhe
28
L’operatore + è sovraccarico
L’operatore + è sovraccarico
• è usato per l’operatore di somma tra numeri interi 10 + 20
• è usato per l’operatore di somma tra numeri razionali 10.0 + 20.0
• va ricordato che, quando si vuole sommare un intero con un
razionale, prima di effettuare la somma l’operando intero viene
convertito implicitamente a reale 10 + 20.0
L’operatore + è usato anche per l’operatore di
concatenazione tra stringhe — se almeno uno dei suoi
due operandi è una stringa
• quando si vuole concatenare una stringa con un numero, prima
di effettuare la concatenazione l’operando numerico viene
convertito implicitamente a stringa "prezzo=" + 10.99
Tipi riferimento e stringhe
29
Semantica dell’operatore +
Bisogna fare attenzione a comprendere il significato di
ogni occorrenza dell’operatore +, ricordando che
• l’operatore + è associativo a sinistra
• l’operatore + è sovraccarico, e ogni occorrenza di + deve essere
opportunamente interpretata (occorrenze diverse dell’operatore +
possono avere interpretazioni differenti)
Le possibili interpretazioni per l’operatore +
• somma intera — se entrambi gli operandi sono interi
• somma reale — se un operando è reale e l’altro è intero o reale
• concatenazione — se almeno un operando è una stringa
Ad esempio
"alfa" + 4 + "beta" vale "alfa4beta"
"alfa" + 4 + 5 vale "alfa45"
4 + 5 + "beta" vale "9beta" — e non "45beta"
Tipi riferimento e stringhe
30
Confronto tra stringhe
L’uguaglianza tra stringhe va verificata invocando il
metodo boolean equals(String t) della classe String
• ad esempio
String s, t, u, v;
s = "automobile";
t = "automobile";
u = "auto" + "mobile";
v = "auto".concat("mobile");
System.out.println(s.equals(t));
System.out.println(s.equals(u));
System.out.println(s.equals(v));
Tipi riferimento e stringhe
31
// true
// true
// true
Confronto tra stringhe
Attenzione
• l’operatore di uguaglianza == potrebbe non funzionare in modo
corretto
String s, t, u, v;
s = "automobile";
t = "automobile";
u = "auto" + "mobile";
v = "auto".concat("mobile");
System.out.println(s==t);
// true
System.out.println(s==u);
// true
System.out.println(s==v);
// false(!)
• l’operatore di uguaglianza == per i tipi riferimento serve a verificare
se due riferimenti referenziano uno stesso oggetto
• la gestione delle stringhe in Java presenta alcuni aspetti complicati
Tipi riferimento e stringhe
32
Uguaglianza tra stringhe
String a, b, c;
a = "automobile";
b = a;
// a==b && a.equals(b)
c = "auto".concat("mobile"); // a!=c && a.equals(c)
a
"automobile" : String
b
c
"automobile" : String
• possono esserci più variabili riferimento che referenziano uno
stesso oggetto
• possono esserci oggetti diversi che hanno lo stesso valore
– che rappresentano la stessa stringa
Tipi riferimento e stringhe
33
Riferimenti e uguaglianza
Gli operatori di uguaglianza (== e !=) possono
essere usati per verificare se due riferimenti sono
uguali
• siano a e b due variabili riferimento di uno stesso tipo
– a==b vale true se le variabili a e b referenziano lo stesso oggetto
– se a==b diciamo che a e b sono identici
– a!=b vale true se le variabili a e b referenziano oggetti diversi
In alcuni casi si vuole verificare se gli oggetti
referenziati da a e b sono uguali tra loro
• intuitivamente, due oggetti sono uguali se hanno lo stesso stato
• va in generale usato un metodo boolean equals(…)
– definito normalmente in tutte le classi
Tipi riferimento e stringhe
34
Confronto lessicografico tra stringhe
Come è possibile confrontare due stringhe per
stabilire in quale relazione d’ordine sono?
• il confronto tra stringhe è basato sull’ordinamento
lessicografico, simile (ma non identico!) a quello (alfabetico)
utilizzato nell’elencazione dei termini in un dizionario
• ad esempio, in un dizionario
alfa precede beta
albero precede alfa
alfa precede alfabeto
• non è possibile usare con i tipi riferimento gli operatori relazionali
< e <=
– questi operatori confronterebbero riferimenti a oggetti, il che non ha nessun
senso (ed è peraltro vietato)
Tipi riferimento e stringhe
35
Il metodo int compareTo(String x)
Per confrontare il valore di due stringhe e
stabilire in quale relazione d’ordine lessicografico
sono si deve utilizzare il metodo int
compareTo(String x) della classe String
• questo metodo confronta il valore di due stringhe, restituendo
– il valore 0 se le due stringhe sono uguali
– un valore negativo se la stringa su cui viene invocato il metodo precede la
stringa argomento — il valore assoluto del valore restituito non è significativo
– un valore positivo se la stringa su cui viene invocato il metodo segue la
stringa argomento — il valore assoluto del valore restituito non è significativo
• ad esempio
"alfa".compareTo("alfa") vale 0
"alfa".compareTo("beta") vale –1
"alfa".compareTo("alba") vale 4
"alfa".compareTo("alfabeto") vale –4
Tipi riferimento e stringhe
36
Il metodo int compareTo(String x)
Il metodo compareTo permette di verificare
l’ordinamento lessicografico, ma non quello
alfabetico (che è quello del dizionario)
"alfa".compareTo("Alfa") vale 32
– la 'A' precede la 'a'
"alfa".compareTo("Beta") vale 31
– tutte le maiuscole precedono tutte le minuscole
"uno".compareTo("1") vale 68
– le cifre precedono le lettere
"papa".compareTo("papà") vale –127
– le vocali accentate seguono tutte le altre lettere
Tipi riferimento e stringhe
37
Il letterale null
Il letterale null rappresenta convenzionalmente
un oggetto non creato
• null può essere assegnato a variabili di qualsiasi tipo riferimento
• null non referenzia nessun oggetto — rappresenta appunto un
riferimento non valido
Ad esempio
• una variabile che rappresenta il nome di una persona potrebbe
valere null
– per indicare che il nome della persona non è noto
• si parla di stringa nulla
– è diverso dalla stringa vuota
Tipi riferimento e stringhe
38
Invocazione di metodi e
NullPointerException
Non è possibile usare un riferimento null
nell’invocazione di un metodo
• viene generato un errore di tipo NullPointerException
• l’invocazione del metodo deve avvenire condizionatamente al
fatto che la variabile sia non nulla
if (x!=null)
... chiedi a x di fare qualcosa ...
Tipi riferimento e stringhe
39
Passaggio di parametri di tipo String:
oggetti non modificabili
Tutti gli oggetti della classe String sono immutabili e
quindi il loro valore non può essere modificato dopo che
sono stati creati.
La classe String non mette a disposizione alcun metodo
per modificare lo stato dell'oggetto.
Supponendo che alla variabile s di tipo String sia
assegnata una stringa, assegnare una nuova stringa alla
variabile s corrisponde a creare un nuovo oggetto e quindi
un nuovo riferimento che viene assegnato a s, senza
modificare la vecchia stringa.
La stringa puntata dal vecchio riferimento rimane in
memoria, ma non è più accessibile.
Tipi riferimento e stringhe
40
Passaggio di parametri di tipo String
Quali valori vengono stampati dalla seguente applicazione?
class LegameStringhe {
public static void alfa(String k) {
System.out.println(" dentro alfa = " + k);
/* crea un nuovo oggetto il riferimento al
precedente viene perso */
k = k.concat("giorno");
System.out.println(" dentro alfa = " + k);
}
public static void main(String[] args) {
String k = "buon";
System.out.println("prima di alfa = " + k);
alfa(k);
System.out.println("dopo alfa = " + k);
}
}
Tipi riferimento e stringhe
41
Esercizi
Data una stringa s, scrivere un metodo che conta e restituisce il
numero di cifre presenti in s. Scrivere l’applicazione relativa che:
legge la stringa, invoca il metodo e stampa il risultato.
Data una stringa s, scrivere un metodo che conta e restituisce il
numero dei soli caratteri alfabetici presenti in s. Scrivere
l’applicazione relativa che: legge la stringa, invoca il metodo e
stampa il risultato.
Data una stringa s scrivere un metodo che conta e restituisce il
numero di vocali maiuscole presenti in s. Scrivere l’applicazione
relativa che: legge la stringa, invoca il metodo e stampa il risultato.
Data una stringa s e un carattere car, scrivere un metodo che
restituisce la posizione di car in s, se esiste. Se car non esiste in s il
metodo deve restituire -1. Non usare il metodo indexOf. Scrivere
l’applicazione relativa che: legge la stringa, legge il carattere car,
invoca il metodo e stampa il risultato.
Tipi riferimento e stringhe
42
Riepilogo della dispensa
 I tipi riferimento sono tipi definiti in corrispondenza a classi. Una
variabile riferimento permette di memorizzare il riferimento a un
oggetto, ma non il ―valore‖ di un oggetto – che è memorizzato in
un’altra area di memoria. Un riferimento non creato è individuato
dal letterale null.
 Java supporta la gestione di stringhe attraverso la classe String; le
variabili di tipo String sono variabili riferimento;
stagione
"estate" : String
String
il valore (o contenuto) di un oggetto String è la stringa
rappresentata da quell’oggetto ed è immutabile: i metodi della
classe String operano creando nuovi oggetti di tipo String e quando
una stringa viene passata come parametro a un metodo il metodo
non ha modo di modificarla
Definizione di metodi
43
Riepilogo della dispensa
 Le posizioni degli N caratteri di una stringa sono
numerate da sinistra verso destra
• il primo carattere ha posizione 0, l’ultimo ha posizione N-1
 Alcuni metodi importanti della classe String:





int length()
String concat(String x)
String substring(int inizio, int fine), String substring(int inizio)
int indexOf(char car), int indexOf(String s)
String.valueOf - accetta come argomento il valore di un certo
tipo primitivo e restituisce un valore String
 char charAt(int posizione)
 boolean equals(String t)
 int compareTo(String x)
Riferimenti al libro di testo
Per lo studio di questi argomenti si fa
riferimento al libro di testo, e in particolare al
 Capitolo 12
 Escluso il paragrafo 12.5.2 e il 12.8
Definizione di metodi
45