Accueil > Programmer avec Java > Structures de données >
đ Strings
Survol et attentes
Définitions
Lâanalyse de texte est une compĂ©tence essentielle pour les programmeurs parce que la plupart des entrĂ©es arrivent initialement sous forme de texte : via la console, un fichier, ou un formulaire web. Les mĂ©thodes de la classe String de Java sont essentielles pour manipuler et analyser les chaĂźnes de caractĂšres.
On a dĂ©jĂ vue dâautres mĂ©thodes pour manipuler les String et pour les comparer. Vous pouvez les rĂ©viser ici (manipulations) et ici (comparaisons).
Objectifs dâapprentissage
Ă la fin de cette leçon vous devrez ĂȘtre en mesure de :
- Analyser le contenu des String avec des méthodes comme
charAt,length,toCharArray,indexOf,lastIndexOf,substring,startsWith,endsWithetcontains. - Nettoyer les entrées texte en utilisant des méthodes comme
replace,stripetsplit. - Se familiariser avec les mĂ©thodes âparseâ pour convertir des String en types primitifs, notamment
Integer.parseIntetDouble.parseDouble.
CritĂšres de succĂšs
- Je peux utiliser une variĂ©tĂ© dâentrĂ©es texte et extraire leurs informations avec confiance dans mes propres programmes.
Méthodes qui utilisent un drapeau booléen (donne une réponse vrai/faux)
Ces mĂ©thodes sont utiles pour sonder le contenu dâun texte, soit comme rĂ©ponse en soi ou comme condition pour une prochaine Ă©tape de traitement. Par exemple, on peut vĂ©rifier si un texte commence ou finit avec une certaine lettre (ou sĂ©quence de lettres) ou sâil contient un mot spĂ©cifique.
Voici quelques exemples :
String s1 = "Hello, World!";
boolean b1 = s1.startsWith("Hello"); // true
boolean b2 = s1.endsWith("World!"); // true
boolean b3 = s1.contains(" "); // true
Méthodes qui utilisent la nature tableau des String (se basent sur des index)
La valeur de chaque String est un tableaux de bytes reprĂ©sentant chacun des caractĂšres Unicode dans le texte. On peut alors accĂ©der Ă chaque caractĂšre individuellement en utilisant un index et une mĂ©thode appropriĂ©e. On peut aussi sonder le texte et recevoir un index en retour au lieu dâune valeur boolĂ©enne.
charAt, length et toCharArray
La mĂ©thode charAt est utile pour accĂ©der Ă un caractĂšre spĂ©cifique dans une chaĂźne de caractĂšres. On utilise un index pour spĂ©cifier la position du caractĂšre, en commençant Ă 0 pour le premier caractĂšre. Si lâindex est plus grand que la longueur de la chaĂźne, une exception StringIndexOutOfBoundsException sera lancĂ©e. On peut obtenir la longueur de la chaĂźne avec la mĂ©thode length(). On peut aussi convertir une chaĂźne de caractĂšres en un tableau de caractĂšres avec la mĂ©thode toCharArray.
String s1 = "Hello, World!";
char c1 = s1.charAt(0); // 'H'
char c2 = s1.charAt(7); // 'W'
char c3 = s1.charAt(s1.length() - 1); // '!'
for (char c : s1.toCharArray()) {
System.out.println((int)c); // affiche le code Unicode de chaque caractĂšre
}
- Notez que la valeur de retour de
charAtest uncharet non unString. Ăa peut ĂȘtre utile pour les comparaisons (avec==) ou pour obtenir la valeur Unicode, mais ça peut aussi causer des problĂšmes si on tente de le traiter comme un String.
indexOf et lastIndexOf
Ces mĂ©thodes sont utiles pour trouver la position dâun caractĂšre ou dâune sĂ©quence de caractĂšres dans une chaĂźne de caractĂšres. La mĂ©thode indexOf retourne la position du premier caractĂšre trouvĂ©, tandis que lastIndexOf retourne la position du dernier caractĂšre trouvĂ©. Si le caractĂšre ou la sĂ©quence nâest pas trouvĂ©, -1 est retournĂ©.
String s1 = "Hello, World!";
int i1 = s1.indexOf("o"); // 4
int i2 = s1.lastIndexOf("o"); // 8
int i3 = s1.indexOf("z"); // -1
La mĂ©thode indexOf peut prendre un deuxiĂšme argument pour spĂ©cifier la position de dĂ©part de la recherche. Ăa peut ĂȘtre utile pour trouver des occurrences multiples dâun caractĂšre ou dâune sĂ©quence.
String s1 = "Hello, World!";
int countOs = 0;
int i = 0;
while (i != -1 && i < s1.length()) {
i = s1.indexOf("o", i); // commencer la recherche Ă partir de la position i
if (i != -1) {
countOs++;
i++; // continuer la recherche aprÚs le dernier "o" trouvé
}
}
System.out.println("On a trouvé " + countOs " 'o' dans le texte.");
substring
Cette mĂ©thode est utile pour extraire une partie dâune chaĂźne de caractĂšres. On spĂ©cifie la position de dĂ©part et la position de fin (exclusif) pour extraire la sous-chaĂźne. Si on ne spĂ©cifie pas la position de fin, la sous-chaĂźne sera extraite jusquâĂ la fin de la chaĂźne.
String s1 = "Hello, World!";
String s2 = s1.substring(7); // "World!"
String s3 = s1.substring(7, 9); // "Wo"
Méthodes pour nettoyer les String
replace
Cette mĂ©thode est utile pour remplacer un caractĂšre ou une sĂ©quence de caractĂšres par un autre. Par exemple, si on veut remplacer tous les espaces par des tirets dans une chaĂźne de caractĂšres, on peut utiliser la mĂ©thode replace. MĂȘme chose pour remplacer les virgules avec des points.
Voici un exemple :
String s1 = "Dé connecté";
String s2 = s1.replace(" ", "-"); // "Dé-connecté"
String s3 = s1.replace(" ","").replace("Dé","Re"); // "Reconnecté"
- Notez que le texte original nâest pas modifiĂ©. La mĂ©thode
replaceretourne une nouvelle chaĂźne de caractĂšres avec les modifications. - Notez quâon peut remplacer quelque chose avec le texte vide
""pour lâĂ©liminer. - On peut aussi chaĂźner les appels de mĂ©thode pour effectuer plusieurs remplacements en une seule ligne. Ăa marche parce que la mĂ©thode
replaceretourne une nouvelle chaßne de caractÚres qui devient le String utilisé pour la prochaine appel dereplace.
strip
Cette mĂ©thode est pratique pour Ă©liminer les espaces blancs inutiles au dĂ©but et Ă la fin dâune chaĂźne de caractĂšres. Elle est surtout importante avant de comparer des String, parce que les espaces feront partie de la comparaison sâils sont encore prĂ©sents.
Voici un exemple :
" Hello, World! ".equals("Hello, World!"); // false
" Hello, World! ".strip().equals("Hello, World!"); // true; strip enlĂšve les espaces initiaux et finaux
Il existe aussi la méthode
trimqui fait la mĂȘme chose, mais elle ne reconnaĂźt pas les espaces Unicode. La mĂ©thodestripest plus moderne et plus fiable.
split
Cette mĂ©thode est utile pour sĂ©parer une ligne de texte, obtenu notamment avec la mĂ©thode nextLine de Scanner, en plusieurs Ă©lĂ©ments. Par exemple, si on a une ligne de texte avec des mots sĂ©parĂ©s par des espaces, on peut les sĂ©parer en utilisant un espace " " comme dĂ©limiteur. Un format de fichier commun est le CSV (Comma Separated Values) oĂč les valeurs sont sĂ©parĂ©es par des virgules ou des points-virgules. La mĂ©thode split est utile pour sĂ©parer ces valeurs en utilisant "," (ou ;) comme dĂ©limiteur.
Voici un exemple oĂč on doit utiliser strip pour nettoyer les valeurs une fois quâelles ont Ă©tĂ© sĂ©parĂ©es :
String s1 = "Hello, World!";
String[] words = s1.split(","); // ["Hello", " World!"]
for (int i = 0; i < words.length; i++) {
words[i] = words[i].strip();
} // ["Hello", "World!"]
Alternative : Scanner
Une autre façon de sĂ©parer les valeurs dâune ligne de texte est dâutiliser un objet Scanner. Voici un exemple :
Scanner sc = new Scanner("Hello, World!");
sc.useDelimiter(",");
while (sc.hasNext()) {
System.out.println(sc.next().strip());
}
sc.close();
- On utilise la méthode
useDelimiterpour spécifier le délimiteur entre les différents éléments du texte. - On utilise la méthode
hasNextpour vĂ©rifier sâil reste des Ă©lĂ©ments Ă traiter dans la boucle. - On peut immĂ©diatement appliquer
stripsur chaque élément pour nettoyer les espaces blancs en le chaßnant avecnext.
Et voici un autre exemple oĂč on connaĂźt le type des donnĂ©es Ă chaque position sur la ligne :
// un Scanner pour la source de données
Scanner sc = new Scanner("Alice, 25, 3.14\nBob, 30, 2.71\n");
while (sc.hasNextLine()) { // boucle pour traiter multiples lignes dans la source
String line = sc.nextLine();
Scanner lsc = new Scanner(line); // un autre Scanner pour chaque ligne
lsc.useDelimiter(",");
String name = lsc.next().strip();
int age = lsc.nextInt();
double rating = lsc.nextDouble();
lsc.close();
System.out.printf("%s a %d ans et une cote de %.2f\n", name, age, rating);
}
sc.close();
La sortie de ce code sera :
Alice a 25 ans et une cote de 3.14
Bob a 30 ans et une cote de 2.71
- On utilise un
Scannerpour traiter chaque ligne de texte. - Rappel : le caractĂšre
\nest le caractÚre pour indiquer une nouvelle ligne. - Connaissant le format des données, on peut utiliser la méthode
next,nextIntetnextDoubleaux endroits appropriés.
Les mĂ©thodes âparseâ
Ces méthodes sont utiles pour convertir des chaßnes de caractÚres en types primitifs. Par exemple, si on veut convertir une chaßne de caractÚres en un entier, on peut utiliser la méthode Integer.parseInt.
Prenons le dernier exemple de lâalternative avec le Scanner. Si on utilise split sur chaque ligne au lieu dâun Scanner, on nâaura pas accĂšs aux mĂ©thodes nextInt et nextDouble pour convertir les valeurs en entiers et en doubles. On doit alors utiliser les mĂ©thodes âparseâ pour convertir les chaĂźnes de caractĂšres en types primitifs.
Voici ce mĂȘme exemple réécrit avec split et les mĂ©thodes âparseâ appropriĂ©es:
Scanner sc = new Scanner("Alice, 25, 3.14\nBob, 30, 2.71\n");
while (sc.hasNextLine()) { // boucle pour traiter multiples lignes dans la source
String line = sc.nextLine();
String[] values = line.split(",");
String name = values[0].strip();
int age = Integer.parseInt(values[1].strip());
double rating = Double.parseDouble(values[2].strip());
System.out.printf("%s a %d ans et une cote de %.2f\n", name, age, rating);
}
sc.close();
- Notez quâon rĂ©fĂšre aux valeurs du tableau
valuesavec leurs index - Notez aussi quâil faut utiliser
strippour nettoyer les valeurs avant de les convertir en entiers ou en doubles, contrairement aux méthodesnextIntetnextDoublequi font ça automatiquement.
Exercices
đ ïž Pratique
Vous rendre sur le site codingbat.com pour les exercices suivants.
- Travaillez dans la section âString-1â pour vous familiariser avec les mĂ©thodes de la classe
String. - Travaillez dans la section âString-2â pour ajouter des boucles Ă vos analyses des entrĂ©es texte.