Keyboard shortcuts

Touchez ← ou → pour naviguer les chapitres

Touchez S ou / pour chercher dans le livre

Touchez ? pour afficher ce message

Touchez Esc pour masquer ce message

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, endsWith et contains.
  • Nettoyer les entrĂ©es texte en utilisant des mĂ©thodes comme replace, strip et split.
  • Se familiariser avec les mĂ©thodes “parse” pour convertir des String en types primitifs, notamment Integer.parseInt et Double.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 charAt est un char et non un String. Ç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 replace retourne 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 replace retourne une nouvelle chaĂźne de caractĂšres qui devient le String utilisĂ© pour la prochaine appel de replace.

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 trim qui fait la mĂȘme chose, mais elle ne reconnaĂźt pas les espaces Unicode. La mĂ©thode strip est 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 useDelimiter pour spĂ©cifier le dĂ©limiteur entre les diffĂ©rents Ă©lĂ©ments du texte.
  • On utilise la mĂ©thode hasNext pour vĂ©rifier s’il reste des Ă©lĂ©ments Ă  traiter dans la boucle.
  • On peut immĂ©diatement appliquer strip sur chaque Ă©lĂ©ment pour nettoyer les espaces blancs en le chaĂźnant avec next.

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 Scanner pour traiter chaque ligne de texte.
  • Rappel : le caractĂšre \n est le caractĂšre pour indiquer une nouvelle ligne.
  • Connaissant le format des donnĂ©es, on peut utiliser la mĂ©thode next, nextInt et nextDouble aux 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 values avec leurs index
  • Notez aussi qu’il faut utiliser strip pour nettoyer les valeurs avant de les convertir en entiers ou en doubles, contrairement aux mĂ©thodes nextInt et nextDouble qui font ça automatiquement.

Exercices

đŸ› ïž Pratique

Vous rendre sur le site codingbat.com pour les exercices suivants.

  1. Travaillez dans la section “String-1” pour vous familiariser avec les mĂ©thodes de la classe String.
  2. Travaillez dans la section “String-2” pour ajouter des boucles Ă  vos analyses des entrĂ©es texte.

© 2022-2025 David Crowley