La classe String
Come usare le stringhe
11/11/01
Classe String
1
La classe String
La classe String, sebbene non sia un tipo base, ne presenta diverse caratteristiche
In particolare in Java le stringhe hanno le seguenti caratteristiche:
1. String è una classe, e quindi le stringhe sono oggetti e non variabili
2. Esiste una speciale notazione (caratteri tra doppi apici) per le costanti stringa, che
rappresenta in realtà una abbreviazione per creare un oggetto stringa il cui
contenuto sia noto a priori
3. Le stringhe sono gli unici oggetti che dispongono dell’operatore + (e +=) che
permette la concatenazione
4. Il contenuto di un oggetto String non può mai essere modificato
5. Esiste un’altra classe, StringBuffer, che permette di modificare il contenuto di una
stringa (usata dal compilatore nelle espressioni di tipo stringa)
6. Una stringa vuota (ma inizializzata) e una stringa nulla (non inizializzata) non sono la
stessa cosa
11/11/01
Classe String
2
Stringa nulla e stringa vuota
1. public class TestString {
2.
3.
public static void main( String args[] ) {
4.
5.
String s1 = "", s2 = null;
6.
System.out.println(s1.length());
7.
System.out.println(s2.length());
8.
}
9.
10. }
0
Exception in thread "main"
java.lang.NullPointerException
at TestString.main(TestString.java:7)
Si noti che si può anche scrivere:
1. System.out.println(“ciao”.length());
4
Una String non è un vettore: si può conoscere la
lunghezza di una stringa per mezzo del metodo
length() (si notino le parentesi)
11/11/01
Classe String
3
L’operatore +
1. public class TestString {
2.
3.
public static void main( String args[] ) {
4.
5.
String s;
6.
s = "ciao";
7.
s += " mondo";
8.
System.out.println(s);
9.
}
10.
ciao mondo
11. }
11/11/01
Classe String
4
String e StringBuffer
Cosa accade effettivamente:
s
“ciao”
Viene calcolata l’espressione “ciao” + “ mondo”
Il compilatore in realtà usa StringBuffer
Il risultato viene quindi riconvertito a String
s
int l = s.length()+” mondo”.length;
StringBuffer tmp = new StringBuffer(l)
tmp.append(s)
tmp.append(“ mondo”);
s = new String(tmp);
“ciao mondo”
s memorizza un riferimento diverso: la stringa “ciao” è ancora in memoria e
non è stata modificata, probabilmente non è nemmeno più utilizzabile
11/11/01
Classe String
5
Creazione di una stringa
Creazione di una stringa
String()
crea una stringa vuota
String(String value)
crea una copia della stringa
String(char[] value)
crea una stringa da un vettore di caratteri
String(char[] value, int offset, int count)
crea una stringa da una porzione di un vettore di caratteri
String(byte[] value)
crea una stringa da un vettore di byte
String(byte[] value, int offset, int count)
crea una stringa da una porzione di un vettore di byte
String(StringBuffer)
crea una stringa da uno StringBuffer
…
11/11/01
Classe String
6
Costruttori di String
1. public class StringConstructors {
2.
public static void main( String args[] )
3.
{
4.
char charArray[] = { 'b','i','r','t','h',' ','d','a','y' };
5.
byte byteArray[] = { (byte) 'n', (byte) 'e', (byte) 'w',
6.
(byte) ' ', (byte) 'y', (byte) 'e',
7.
(byte) 'a', (byte) 'r' };
8.
9.
String s1 = new String( "hello" ), s[] = new String[8];
10.
StringBuffer buffer = new StringBuffer( "Welcome" );
11.
12.
// uso dei costruttori della classe String
s[0]=null!
13.
s[1] = new String();
s[1]=!
14.
s[2] = new String( s1 );
s[2]=hello!
15.
s[3] = new String( charArray );
s[3]=birth day!
16.
s[4] = new String( charArray, 6, 3 );
s[4]=day!
17.
s[5] = new String( byteArray, 4, 4 );
s[5]=year!
18.
s[6] = new String( byteArray );
s[6]=new year!
19.
s[7] = new String( buffer );
s[7]=Welcome!
20.
21.
for(int i=0; i<s.length; i++)
22.
System.out.println("s[" + i + “]=" + s[i] + "!");
23.
}
24. }
25.
/* (C) Copyright 1999 by Deitel & Associates, Inc. and Prentice Hall. */
11/11/01
Classe String
7
Confronto di stringhe
Tutti i caratteri sono rappresentati da codici numerici
Quando i computer confrontano stringhe, confrontano i codici numerici
Le lettere maiuscole sono perciò diverse dalle lettere minuscole
Metodi per il confronto
s1.equals( "Ciao" )
Restituisce true se s1 è uguale a "Ciao"
s1.equalsIgnoreCase( otherString )
Restituisce true se s1 è uguale a otherString
“ciao" è uguale a "CIAO", ma anche a "CiAo“
s1.compareTo( otherString ) restituisce
0 se le due stringhe sono uguali
un valore negativo se s1 è minore di otherString
un valore positivo se s1 è maggiore di otherString
11/11/01
Classe String
8
Confronto di stringhe
operatore ==
Restituisce true se due riferimenti puntano alla stessa locazione di memoria
Si noti che Java utilizza un solo riferimento di memoria anche per stringhe
costanti introdotte in momenti diversi
s1 = "hello";
s2 = new String( "hello" );
s1 == "hello";
//true
s2 == "hello";
//false
11/11/01
Classe String
9
Ricerca di stringhe
Metodi di ricerca
int
indexOf(int ch)
Restituisce l’indice della prima occorrenza del carattere ch,-1 se non
presentenella stringa che invoca il metodo
int
indexOf(int ch, int fromIndex)
Come sopra, ma la ricerca parte dall’indice fromIndex
int
int
indexOf(String str)
indexOf(String str, int fromIndex)
Come sopra, ma viene ricercata una stringa, non un singolo carattere
int
int
int
int
lastIndexOf(int ch)
lastIndexOf(int ch, fromIndex)
lastIndexOf(String str)
lastIndexOf(String str , fromIndex)
Restituisce l’indice dell’ultima occorrenza,-1 se non presente.
boolean startsWith(String prefisso)
boolean endsWith(String suffisso)
11/11/01
Verifica che la stringa inizia/termina con il prefisso/suffisso specificato
Classe String
10
Ricerca di stringhe
1. public class TestString {
2.
3.
public static void main( String args[] ) {
4.
String s = "ippopotamo";
5.
System.out.println(s.indexOf("po"));
6.
System.out.println("ippopotamo".indexOf("po", 3));
7.
System.out.println(s.indexOf("up"));
2
8.
}
4
9.
-1
10. }
11/11/01
Classe String
11
Estrazione di stringhe
Metodi di estrazione
char
charAt(int index)
Restituisce il carattere posto all’indice index
String
substring(int inizio, int fine)
Estrae la stringa dal carattere di indice inizio a fine escluso
String
substring(int inizio)
Estrae il suffisso della stringa dal carattere di indice inizio
String
trim()
Elimina i whitespace all’inizio e alla fine della stringa
1.
2.
3.
4.
5.
6.
7.
8.
11/11/01
public class TestString {
public static void main( String args[] ) {
System.out.println("ippopotamo".substring(3,5));
System.out.println(
op
"ippopotamo".substring(3,5).charAt(0));
o
}
}
I metodi possono essere
concatenati fra loro
Classe String
12
Eliminazione di doppi spazi
1. public class TestString {
2.
3.
public static void main( String args[] ) {
4.
String s="A bc def
ghi";
5.
System.out.println(s);
6.
for(int start=0; (start=s.indexOf(" ", start))>=0;) {
7.
System.out.println(start);
8.
s = s.substring(0, start) + s.substring(start+1);
9.
}
10.
System.out.println(s);
A bc def
ghi
11.
}
4
12.
8
13. }
8
A bc def ghi
Creo una nuova stringa eliminando il
carattere di indice start
Start viene aggiornato ad ogni
iterazione
Non ho operazioni di fine ciclo
11/11/01
Classe String
13
Altri metodi
public String toLowerCase() ritorna una nuova stringa con i caratteri tutti
minuscoli
public String toUpperCase() ritorna una nuova stringa con i caratteri tutti
maiuscoli
…
Ed altri ancora
Provare a sostituire in un testo un nome (senza distinguere tra maiuscole e minuscole)
con lo stesso nome che abbia solo la prima lettera maiuscola
Esempio:
MARIO, mario, MaRiO Mario
11/11/01
Classe String
14
Un semplice esempio di lettura
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
11/11/01
/**
Il programma legge un file (di al più 1000 byte)
e lo memorizza nella stringa s
uso: java TestLettura < "nomefile"
*/
import java.io.*;
public class TestLettura {
public static void main( String args[] ) throws IOException {
byte[] v = new byte[1000];
// legge dal file fino ad un massimo di 1000 byte
// restituisce il numero di byte effettivamente letti
int length = System.in.read(v);
//System.out.println("length="+length);
//crea una stringa con i primi length byte del vettore v
String s = new String(v, 0, length);
System.out.println(s);
}
}
Classe String
15
Formattazione di numeri
Formattatori numerici: metodi
NumberFormat getInstance()
restituisce una istanza di formattazione standard
void setMaximumIntegerDigits(int num)
numero massimo di cifre intere
void setMinimumIntegerDigits(int num)
numero minimo di cifre intere
void setMaximumFractionDigits(int num)
numero massimo di cifre decimali
void setMinimumFractionDigits(int num)
numero minimo di cifre decimali void
setMinimumFractionDigits(int num)
numero minimo di cifre decimali
String format(long num)
restituisce un intero formattato
String format(double num)
restituisce un numero con decimali formattato
…
11/11/01
Classe String
16
Formattazione di numeri
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
11/11/01
import java.text.*;
Import java.util.Locale;
public class TestFormat {
public static void main(String[] args) {
// I numeri vengono formattati con le convenzioni italiane
NumberFormat nf = NumberFormat.getInstance(Locale.ITALIAN);
double d=1.0/3.0;
System.out.println(d);
0.3333333333333333
System.out.println(nf.format(d));
0,333
System.out.println(nf.format(d*10000));
3.333,333
nf.setMaximumFractionDigits(2);
0,33
System.out.println(nf.format(d));
0,3
System.out.println(nf.format(0.3));
0,300
nf.setMinimumFractionDigits(3);
000,300
System.out.println(nf.format(0.3));
001
nf.setMinimumIntegerDigits(3);
System.out.println(nf.format(0.3));
nf.setMinimumFractionDigits(0);
System.out.println(nf.format(1));
}
}
Classe String
17
Formattazione di numeri
1. import java.text.*;
2.
0.30
3. public class TestFormat {
-0.30
4.
3333.333
5.
public static void main(String[] args) {
6.
DecimalFormat nf = new DecimalFormat("0.00#");
7.
System.out.println(nf.format(0.3));
8.
System.out.println(nf.format(-0.3));
9.
System.out.println(nf.format(10000/3.0));
10.
}
11. }
DecimalFormat(String formato) crea un formattatore
secondo una stringa modello:
0 – la cifra deve essere presente
# - la cifra può essere presente
………
11/11/01
Classe String
18
Formattazione di numeri
1. public class TestFormat {
2.
3.
public static void main(String[] args) {
-0.250
4.
System.out.println(format(-0.25, 4, 3));
-1
5.
System.out.println(format(-1.25, 4, 0));
6.
}
7.
8.
static String format(double val, int intDigit, int fracDigit) {
9.
String ris = String.valueOf(val);
10.
String prefix, suffix;
11.
int point = ris.indexOf('.'), i;
È un metodo statico di String che
12.
if(point<0) {
restituisce una rappresentazione in
13.
prefix = ris;
stringa del parametro
14.
suffix = "";
15.
} else {
16.
prefix = ris.substring(0, point);
17.
suffix = ris.substring(point+1);
18.
}
19.
for(i=prefix.length(); i<intDigit; i++) prefix = ' '+prefix;
20.
for(i=suffix.length(); i<fracDigit; i++) suffix += '0';
21.
if(fracDigit>0) return prefix+'.'+suffix.substring(0, fracDigit);
22.
else return prefix;
23.
}
24. }
11/11/01
Classe String
19