✂️ Le cours : manipuler du texte
En Java, le texte est représenté par la classe String. Contrairement au C, il n'y a ni '\0' à gérer ni tableau de caractères à dimensionner : un String connaît sa longueur et sait s'agrandir en créant de nouveaux objets. Les indices commencent à 0, comme dans les tableaux.
Un String est immuable
Aucune méthode ne modifie un String existant : toUpperCase(), replace(…), trim()… renvoient un nouveau texte. Si tu ignores ce résultat, rien ne change.
public class Immuable {
public static void main(String[] args) {
String mot = "nsi";
mot.toUpperCase(); // résultat ignoré : mot ne change pas
System.out.println(mot);
mot = mot.toUpperCase(); // on range le nouveau String dans mot
System.out.println(mot);
}
}
Parcourir une chaîne
length() donne le nombre de caractères et charAt(i) le caractère d'indice i (de type char, à écrire entre apostrophes pour le comparer). Ici, on compte les voyelles.
public class Voyelles {
public static void main(String[] args) {
String texte = "programmation";
int voyelles = 0;
for (int i = 0; i < texte.length(); i++) {
char c = texte.charAt(i);
if ("aeiou".indexOf(c) >= 0) {
voyelles++;
}
}
System.out.println(voyelles + " voyelles");
}
}
On peut aussi écrire for (char c : texte.toCharArray()), qui parcourt chaque caractère sans indice.
Comparer deux chaînes
equals teste l'égalité du texte, equalsIgnoreCase ignore la casse, compareTo donne l'ordre alphabétique (nombre négatif si le premier mot vient avant, 0 si égaux, positif sinon). N'utilise jamais == pour comparer du texte (voir Conditions).
public class Comparer {
public static void main(String[] args) {
String a = "chat";
String b = "chien";
System.out.println(a.equals("chat"));
System.out.println("CHAT".equalsIgnoreCase(a));
System.out.println(a.compareTo(b) < 0); // "chat" avant "chien"
}
}
Construire un long texte : StringBuilder
Chaque + sur un String crée un nouvel objet : dans une boucle de n tours, le coût devient quadratique. StringBuilder est un texte modifiable : append ajoute à la fin sans tout recopier, toString() donne le résultat final.
public class Construction {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
for (int i = 1; i <= 5; i++) {
sb.append(i);
if (i < 5) {
sb.append(", ");
}
}
System.out.println(sb.toString());
System.out.println(new StringBuilder("NSI").reverse());
}
}
Affichage1, 2, 3, 4, 5
ISN
Mettre en forme avec String.format
String.format utilise les mêmes formats que printf (%d, %s, %f…) mais renvoie le texte au lieu de l'afficher. Une largeur (%6s) aligne à droite, un tiret (%-6s) aligne à gauche, %05d complète par des zéros.
public class Format {
public static void main(String[] args) {
System.out.println(String.format("%05d", 42));
System.out.println(String.format("[%-6s]", "ab"));
System.out.println(String.format("[%6s]", "ab"));
System.out.println("NSI".repeat(2));
}
}
Affichage00042
[ab ]
[ ab]
NSINSI
Convertir entre texte et nombres
| Conversion | Instruction | Remarque |
texte → int | Integer.parseInt("42") | lève NumberFormatException si le texte n'est pas un entier |
texte → double | Double.parseDouble("3.5") | attend un point décimal |
| nombre → texte | String.valueOf(42) ou "" + 42 | Integer.toString(42) marche aussi |
char → code | (int) 'A' vaut 65 | et (char) 66 vaut 'B' |
La classe Character fournit isDigit, isLetter, isUpperCase, toUpperCase… pour tester ou transformer un seul caractère.