Listes, tableaux et chaînes de caractères en Java
DébutantUnité 4 sur 11 de la formation Formation : Java orienté objet : classes, collections, héritage et tests
Ce que tu vas apprendre
- Crée des ArrayList, ajoute, lis, remplace et supprime des éléments, vérifie le contenu d’une liste et comprends ce qui se passe lorsqu’une liste est partagée ou transmise à une méthode.
- Crée une liste et manipule ses éléments par indiceImporte et crée une ArrayList, ajoute des éléments, lis-les et remplace-les par leur indice, et reste dans l’intervalle des indices valides.
- Supprime des éléments et vérifie le contenu d’une listeSupprime des éléments par indice ou par valeur, trouve des valeurs avec contains et indexOf, et évite les pièges liés aux listes d’Integer et au décalage des indices.
- Partage des listes entre variables et méthodesExplique ce que contient une variable de liste, ce qui se passe lorsqu’une liste est affectée ou transmise à une méthode, comment copier une liste et comment comparer deux listes.
- Crée une liste et manipule ses éléments par indice
- Crée des tableaux, lis et écris leurs éléments, transmets-les et copie-les correctement, puis choisis entre un tableau et une ArrayList.
- Crée des tableaux et accède à leurs élémentsDéclare et crée des tableaux, remplis-les, lis et écris leurs éléments par indice, et identifie leur longueur, leurs valeurs par défaut et la façon de les afficher.
- Transmets, copie et compare des tableaux, puis choisis entre tableaux et listesExplique les références à des tableaux, copie et compare correctement des tableaux, échange des éléments et détermine quand un tableau ou une ArrayList convient à la tâche.
- Crée des tableaux et accède à leurs éléments
- Parcours chaque élément avec des boucles à indice et des boucles for-each, calcule des sommes, des moyennes et des extrema, recherche des valeurs et modifie une liste sans erreur pendant son parcours.
- Parcours des listes et des tableaux avec des boucles for et for-eachÉcris des boucles à indice et des boucles for-each sur des listes, des tableaux et les caractères d’une chaîne, et choisis la boucle adaptée à la tâche.
- Calcule des sommes, des moyennes, des effectifs et des extremaUtilise des variables accumulatrices pour calculer des sommes, des moyennes, des effectifs, des maximums et des minimums, et construis une liste filtrée.
- Recherche une valeur dans une liste ou un tableauÉcris des recherches linéaires qui renvoient une position, une réponse par oui ou non ou toutes les correspondances, et recherche selon une condition plutôt qu’une valeur exacte.
- Modifie une liste sans erreur pendant son parcoursSupprime ou ajoute des éléments pendant une boucle sans en sauter ni provoquer d’exception, et choisis une méthode sûre pour le faire.
- Parcours des listes et des tableaux avec des boucles for et for-each
- Considère une chaîne comme une séquence de caractères, recherche et extrais des parties, nettoie-la et transforme des lignes de texte en données et inversement.
- Lis les caractères d’une chaîneUtilise length et charAt, parcours les caractères, manipule des valeurs char, assemble du texte avec + et comprends que les chaînes ne peuvent pas être modifiées.
- Recherche, extrais et nettoie des parties d’une chaîneLocalise du texte avec indexOf et contains, extrais des parties avec substring, et modifie la casse, les espaces et le contenu avec replace, trim et les méthodes associées.
- Découpe du texte et convertis du texte en nombresDécoupe une ligne en champs avec split, convertis les champs en nombres et les nombres en texte, vérifie les parties et assemble-les à nouveau.
- Lis les caractères d’une chaîne
- Compare des chaînes par contenu et par ordre alphabétique, et utilise StringBuilder pour construire et modifier du texte étape par étape.
- Compare des chaînes avec equals et compareToUtilise equals et equalsIgnoreCase pour tester le contenu, évite le piège de == et les erreurs liées à null, et utilise compareTo pour ordonner des chaînes.
- Construis et modifie du texte avec StringBuilderUtilise StringBuilder pour construire du texte dans une boucle et le modifier en place, convertis le résultat en String et évite les erreurs courantes avec StringBuilder.
- Compare des chaînes avec equals et compareTo
Listes et tableaux en Java : cours
1Stocke et gère des données dans une ArrayList
Une ArrayList regroupe des valeurs liées dans une collection ordonnée, même lorsque tu ne connais pas leur nombre final. Commence par créer une liste dont le type est précisé, puis insère, remplace, supprime et trouve des éléments par indice ou par valeur. Suis ensuite ce qui se passe lorsque deux variables ou une méthode partagent cette liste, pour choisir entre modifier les données existantes et créer un résultat distinct.
1.1 Crée et modifie une ArrayList
Une ArrayList stocke des valeurs dans l’ordre. Elle grandit quand tu ajoutes un élément et rétrécit quand tu en supprimes un. Chaque élément possède un indice, à partir de 0. Importe la classe avant de l’utiliser : import java.util.ArrayList;.
Crée une liste dont le type est précisé
ArrayList<String> drinks = new ArrayList<>();
drinks.add("tea");
drinks.add("milk");
Le type indiqué entre les chevrons dans <String> précise ce que la liste stocke. Le diamant <> à droite permet à Java de déduire ce même type. La liste est d’abord vide, de taille 0 ; après ces deux appels, elle contient [tea, milk] et sa taille est 2. Afficher directement la liste montre ses éléments : System.out.println(drinks);.
Le type des éléments d’une liste doit être un type de classe. Pour les nombres, utilise une classe enveloppe : Integer pour int, Double pour double, Boolean pour boolean ou Character pour char. ArrayList<int> ne compile pas. Avec ArrayList<Integer> numbers = new ArrayList<>();, numbers.add(5) fonctionne car Java convertit automatiquement l’int en Integer. Le lire dans int n = numbers.get(0); effectue la conversion inverse.
Suis chaque changement d’indice
String old = drinks.set(0, "coffee");
drinks.add(1, "water");
String last = drinks.get(2);
set(0, "coffee") remplace le premier élément et renvoie l’ancienne valeur, donc old vaut "tea". La taille reste 2. L’insertion de "water" à l’indice 1 décale "milk" vers la droite. La liste est maintenant [coffee, water, milk] ; last vaut "milk" et la taille est 3.
| Tâche | Appel | Indice valide |
|---|---|---|
| Lire un élément | get(i) | De 0 à size() - 1 |
| Remplacer un élément | set(i, value) | De 0 à size() - 1 |
| Insérer un élément | add(i, value) | De 0 à size() |
| Ajouter un élément à la fin | add(value) | Aucun indice nécessaire |
L’indice supplémentaire autorisé pour l’insertion correspond à la position juste après le dernier élément actuel. Dans cette liste, add(3, "juice") ajoute l’élément à la fin, mais get(3) échouerait avant cette insertion. Un indice invalide provoque une IndexOutOfBoundsException. Utilise get(size() - 1) pour le dernier élément, après avoir vérifié que la liste n’est pas vide.
Commence avec des données ou collecte des saisies
Avec import java.util.List;, new ArrayList<>(List.of("red", "green", "blue")) crée une liste modifiable contenant ces valeurs. List.of(...) seul crée une liste non modifiable : add, set et remove provoquent une UnsupportedOperationException. Tu verras aussi List<String> names = new ArrayList<>(); ; la variable de type général List prend toujours en charge ces méthodes de liste.
Pour collecter des lignes jusqu’à une ligne vide, utilise un Scanner nommé scanner et une liste vide nommée lines :
while (true) {
String line = scanner.nextLine();
if (line.isEmpty()) {
break;
}
lines.add(line);
}
La ligne qui arrête la saisie est vérifiée avant l’ajout : elle n’est donc pas stockée. lines.size() compte les lignes stockées. lines.isEmpty() vérifie s’il n’y en a aucune, et lines.clear() les supprime toutes quand tu dois réutiliser la liste.
Points clés
- Les indices commencent à 0 ; le dernier élément est à
size() - 1. setremplace ;addavec un indice insère et décale les éléments suivants.- Utilise des types enveloppes comme
Integerdans une ArrayList. - Copie
List.of(...)dans une ArrayList lorsque la liste doit être modifiée. clear()supprime tous les éléments ; une liste vide a une taille de 0.
1.2 Supprime des valeurs et trouve leurs positions
Supprimer un élément modifie à la fois la taille et les indices des éléments suivants. Une recherche t’indique si une valeur existe ou où elle se trouve maintenant. Distingue bien une valeur de sa position, surtout dans une liste d’entiers.
Deux sens de remove
| Appel | Signification | Résultat renvoyé |
|---|---|---|
remove(int index) | Supprimer l’élément à une position | L’élément supprimé |
remove(Object value) | Supprimer la première valeur égale | true si elle est supprimée ; sinon false |
Pour [coffee, water, milk], remove(0) renvoie "coffee" et laisse [water, milk]. L’ancien indice 2 de "milk" est maintenant invalide ; cette valeur est passée à l’indice 1. Un indice enregistré n’est utile que tant que les modifications n’ont pas changé les positions qu’il décrit.
Supprimer par valeur ne signifie pas supprimer toutes les correspondances. En partant de [a, b, a], remove("a") laisse [b, a]. Un deuxième appel supprime le "a" restant. Supprimer une valeur absente renvoie false et laisse la liste inchangée ; tu peux donc utiliser directement le résultat :
boolean removed = names.remove("Lena");
if (removed) {
System.out.println("Name removed");
}
Le piège de la surcharge pour les entiers
Un argument int sélectionne la forme par indice, même lorsque la liste stocke des entiers :
ArrayList<Integer> numbers = new ArrayList<>(List.of(10, 20, 30));
int removed = numbers.remove(1);
boolean found = numbers.remove(Integer.valueOf(10));
Le premier appel supprime l’élément à l’indice 1, donc removed vaut 20 et la liste devient [10, 30]. Le deuxième appel fournit explicitement un objet Integer. Il supprime la valeur 10, donne à found la valeur true et laisse [30]. Appeler remove(10) sur la liste d’origine de trois éléments essaierait d’accéder à l’indice 10 et provoquerait une IndexOutOfBoundsException.
Choisis un résultat de recherche
Pour colors = [red, green, blue, green], contains("green") vaut true, indexOf("green") vaut 1 et lastIndexOf("green") vaut 3. contains donne une réponse par oui ou non. Les deux méthodes qui renvoient un indice donnent la première ou la dernière position correspondante. Une valeur absente produit respectivement false ou -1.
Ces méthodes utilisent equals pour comparer les éléments. Les contenus des chaînes doivent correspondre exactement, casse comprise : indexOf("Green") vaut -1 pour cette liste. Pour une recherche insensible à la casse, une boucle peut comparer chaque nom avec equalsIgnoreCase.
Une correspondance à l’indice 0 reste une correspondance. Le test indexOf(x) > 0 la manque. Si tu as besoin de la position, teste explicitement la valeur indiquant l’absence :
int index = colors.indexOf("red");
if (index != -1) {
colors.remove(index);
}
Ici, la recherche renvoie 0, le test réussit et la suppression à l’indice 0 laisse [green, blue, green]. Pour éviter les noms en double, vérifie avant d’ajouter : if (!names.contains(name)) { names.add(name); }. Pour supprimer toutes les occurrences, tu peux répéter la suppression tant que contains vaut true ou utiliser une boucle inverse sûre. Une boucle qui avance et incrémente toujours après une suppression peut sauter un élément décalé.
Points clés
remove(index)renvoie un élément ;remove(value)renvoie un booléen.- Pour une valeur entière, utilise
remove(Integer.valueOf(x)). - Une suppression décale les éléments suivants d’une position vers la gauche.
indexOfetlastIndexOfrenvoient -1 pour une valeur absente ; 0 signifie que la valeur est trouvée.- Les recherches de chaînes sont sensibles à la casse et comparent les contenus.
- La suppression par valeur ne supprime que la première correspondance.
1.3 Comprends les listes partagées et les copies
Une variable de liste contient une référence à un objet. Elle ne contient pas tous les éléments dans la variable elle-même. Cela explique pourquoi modifier une liste par un nom peut affecter un autre nom, et pourquoi affecter une valeur à un paramètre a un effet différent de la modification de ses éléments.
Suis les références
ArrayList<String> original = new ArrayList<>(List.of("tea"));
ArrayList<String> alias = original;
ArrayList<String> copy = new ArrayList<>(original);
alias.add("milk");
copy.add("juice");
original et alias désignent une même liste. Après l’ajout par alias, les deux montrent [tea, milk]. La copie est une liste distincte, créée avant cet ajout : elle contient donc [tea, juice]. Deux noms pour un même objet sont des alias. L’affectation copie une référence ; le constructeur de copie crée une nouvelle liste et y copie les éléments.
La liste copiée contient des références aux mêmes objets éléments. Avec les chaînes et les valeurs enveloppées, ces objets éléments ne peuvent pas changer : remplacer une case dans une liste ne modifie donc pas la case de l’autre liste. Copier une liste suffit pour permettre aux deux listes d’ajouter, de supprimer et de remplacer des éléments indépendamment.
Une méthode reçoit une copie de la référence
Java transmet les arguments par valeur. Pour une liste, cette valeur est une référence. L’appelant et le paramètre désignent initialement la même liste :
static void addBonus(ArrayList<Integer> scores, int bonus) {
for (int i = 0; i < scores.size(); i++) {
scores.set(i, scores.get(i) + bonus);
}
}
Appeler addBonus(scores, 5) sur [70, 85] transforme la liste de l’appelant en [75, 90]. La méthode n’a pas besoin de renvoyer une liste car elle modifie l’objet partagé. Mais l’affectation scores = new ArrayList<>(); dans la méthode ne redirige que son paramètre local. La variable de l’appelant désigne toujours l’ancienne liste.
Un paramètre int reçoit une copie du nombre. Modifier ce paramètre ne peut pas modifier la variable int de l’appelant. Dans les deux cas, le paramètre est local ; ce qui change, c’est que sa valeur désigne ou non un objet modifiable partagé.
Renvoie de nouvelles données lorsque c’est la tâche demandée
static ArrayList<String> longWords(ArrayList<String> words, int minLength) {
ArrayList<String> result = new ArrayList<>();
for (String word : words) {
if (word.length() >= minLength) {
result.add(word);
}
}
return result;
}
La méthode lit words et écrit uniquement dans result, donc l’entrée reste inchangée. Une méthode qui modifie un argument doit indiquer ce comportement, comme le fait addBonus. Une méthode qui renvoie de nouvelles données facilite la vérification de la sortie séparément de l’entrée.
Compare les contenus et gère l’absence de résultat
a == b vérifie si deux références de liste désignent le même objet. a.equals(b) vérifie que les tailles sont égales et que les éléments sont égaux dans le même ordre. Deux listes [1, 2] construites séparément ont un contenu égal mais des identités différentes ; [2, 1] n’a pas le même contenu dans l’ordre de la liste.
Une liste vide est un véritable objet de taille 0. Une boucle qui la parcourt ne s’exécute aucune fois, mais get(0) échoue car il n’existe aucun indice d’élément. null signifie qu’il n’y a aucun objet liste ; même size() provoque alors une NullPointerException. Une méthode sans correspondance peut renvoyer une liste de résultat vide, ce qui permet à son appelant de parcourir normalement le résultat.
Points clés
- L’affectation partage une liste ;
new ArrayList<>(original)crée une liste distincte. - Une méthode peut modifier la liste de l’appelant par une copie de la référence.
- Réaffecter un paramètre ne redirige pas la variable de l’appelant.
equalspour les listes compare les contenus ordonnés ;==compare l’identité.- Une liste vide peut être parcourue ;
nullne référence aucune liste.
2Stocke des données de taille fixe dans des tableaux
Les tableaux attribuent à chaque valeur une case numérotée dans une structure dont la longueur reste fixe. Crée et remplis ces cases, lis leurs valeurs par défaut et affiche clairement leur contenu. Pour copier, comparer, échanger et transmettre des tableaux à des méthodes, il faut comprendre quelles variables référencent le même objet. Utilise ces notions pour choisir un tableau ou une ArrayList selon la tâche.
2.1 Crée des tableaux avec un nombre fixe de cases
Un tableau stocke un nombre fixe d’éléments d’un même type. Tu choisis sa longueur à sa création. Les éléments peuvent changer, mais pas le nombre de cases de ce tableau. Les tableaux peuvent stocker directement des valeurs primitives.
Crée et remplis des cases
int[] scores = new int[5];
scores[0] = 90;
int first = scores[0];
int[] primes = {2, 3, 5, 7, 11};
new int[5] crée cinq cases. Leurs indices sont 0, 1, 2, 3 et 4. Les crochets permettent de lire et d’écrire une case, donc first prend la valeur 90. L’initialiseur de primes crée et remplit cinq cases à la fois. Lorsqu’un tableau rempli est nécessaire dans une expression, comme un argument de méthode, utilise new int[] {2, 3, 5}.
La longueur est un champ : scores.length, sans parenthèses. Elle compte toutes les cases, y compris celles auxquelles tu n’as pas affecté de valeur toi-même. Ajouter une valeur à la case 0 ne fait pas passer la longueur de 5 à 1.
| Structure | Nombre d’éléments | Lire un élément |
|---|---|---|
| Tableau | a.length | a[i] |
| ArrayList | a.size() | a.get(i) |
| String | s.length() | s.charAt(i) |
Ces noms ne sont pas interchangeables. Un tableau n’a pas de méthode size(), et une chaîne nécessite des parenthèses après length.
Identifie les valeurs initiales
Les nouvelles cases d’un tableau reçoivent des valeurs par défaut. Les tableaux de types primitifs numériques commencent avec zéro : 0 pour int, 0,0 pour double. Un boolean[] commence avec false ; un char[] commence avec le caractère dont le code est zéro, écrit '\u0000'. Les tableaux de types de classe, dont String[], commencent avec des références null.
String[] words = new String[3];
words[0] = "sun";
System.out.println(words[0].length());
Ce code affiche 3 car la case 0 référence maintenant "sun". Les cases 1 et 2 contiennent encore null. Appeler words[1].length() provoque une NullPointerException : il n’y a pas encore de chaîne à cet endroit. Une case contenant null par défaut est différente d’une chaîne vide "", qui est un objet de longueur 0.
Lis la sortie et reste dans le tableau
Importe java.util.Arrays et utilise System.out.println(Arrays.toString(scores)); pour afficher [90, 0, 0, 0, 0]. Afficher directement scores montre un code de type et d’identité comme [I@1b6d3586, pas ses éléments. Le code d’identité ne constitue pas un compte rendu utile des nombres stockés.
Voici les températures d’une semaine en degrés Celsius :
double[] temps = {12.5, 14.0, 9.5, 11.0, 15.5, 13.0, 10.5};
temps[2] = 10.0;
La mesure du troisième jour passe de 9,5 à 10,0. La première mesure est temps[0] ; la dernière est temps[6], ou temps[temps.length - 1]. temps[7] est en dehors du tableau. Java provoque une ArrayIndexOutOfBoundsException pour un indice de tableau invalide. Dans une boucle à indice, utilise i < temps.length : i <= temps.length essaie d’accéder à une case supplémentaire après la dernière case valide. Un tableau de longueur nulle n’a aucun indice d’élément valide.
Points clés
- La longueur d’un tableau est fixée à sa création.
- Utilise
a[i]pour lire ou écrire une case eta.lengthpour compter les cases. - Les nouvelles cases numériques contiennent zéro ; les nouvelles cases de type String contiennent
null. Arrays.toString(a)affiche le contenu.- Le dernier indice valide est
a.length - 1.
2.2 Copie et compare des tableaux, et échange leurs éléments
Une variable de tableau contient une référence, tout comme une variable de liste. Affecter cette référence crée un autre nom pour le même tableau. Une copie distincte nécessite un nouvel objet tableau, et comparer les contenus nécessite une méthode qui vérifie les cases.
Affectation et copie
int[] a = {4, 9, 2};
int[] alias = a;
int[] copy = Arrays.copyOf(a, a.length);
alias[0] = 99;
Maintenant, a et alias montrent tous deux [99, 9, 2] ; copy montre toujours [4, 9, 2]. Arrays.copyOf(a, a.length) crée un nouveau tableau de même longueur. a.clone() peut aussi le copier. Importe java.util.Arrays pour les méthodes utilitaires.
Demander une longueur différente modifie le nouveau tableau, pas l’ancien. Arrays.copyOf(new int[] {2, 3, 5}, 4) donne [2, 3, 5, 0]. Les cases supplémentaires reçoivent des valeurs par défaut. Pour qu’une variable référence un tableau plus grand, affecte-lui la copie renvoyée. Tout alias de l’original référence toujours l’ancien tableau.
Les appels de méthode partagent l’objet
static void doubleAll(int[] values) {
for (int i = 0; i < values.length; i++) {
values[i] = values[i] * 2;
}
}
Le paramètre reçoit une copie de la référence. La méthode modifie donc les cases du tableau de l’appelant. Réaffecter values à un nouveau tableau ne modifierait que le paramètre. Une méthode peut aussi renvoyer un nouveau tableau : return new int[] {values[0], values[values.length - 1]}; produit [4, 2] pour l’entrée {4, 9, 2}. Cette expression nécessite une entrée non vide car elle lit deux indices.
L’égalité de contenu est différente pour les tableaux
Pour les tableaux créés séparément a = {1, 2} et b = {1, 2}, a == b et a.equals(b) valent tous deux false : equals pour les tableaux vérifie l’identité. Arrays.equals(a, b) vaut true car les éléments correspondants sont égaux. C’est différent pour une ArrayList, dont la méthode equals compare les contenus ordonnés.
Sauvegarde une valeur avant de l’écraser
Pour échanger deux positions, conserve une ancienne valeur dans une variable temporaire :
int temp = a[0];
a[0] = a[2];
a[2] = temp;
En partant de {4, 9, 2}, la première ligne sauvegarde 4. La deuxième produit [2, 9, 2]. La troisième rétablit le 4 sauvegardé à l’indice 2, ce qui donne [2, 9, 4]. Sans temp, affecter a[2] = a[0] après la deuxième ligne recopierait 2 et ferait perdre le 4 d’origine.
Choisis une structure adaptée aux données
| Besoin | Choix adapté |
|---|---|
| Une case fixe pour chaque jour ou chaque mois | Tableau |
| Des valeurs primitives sans classes enveloppes | Tableau |
| Ajouter ou supprimer des éléments au fur et à mesure des saisies | ArrayList |
Les tableaux apparaissent aussi dans main(String[] args) et comme résultat de String.split. Pour un String[] words, new ArrayList<>(Arrays.asList(words)) crée une liste qui peut grandir. Pour un int[], crée une ArrayList<Integer> et ajoute chaque entier dans une boucle. Arrays.asList appliqué au tableau primitif traite le tableau entier comme un seul élément : il ne crée donc pas une liste de ses nombres individuels.
Points clés
- L’affectation d’un tableau partage le même objet ;
copyOfouclonecrée une copie. - Utilise
Arrays.equalspour comparer le contenu des tableaux. - Une méthode peut modifier les cases d’un tableau partagé par l’intermédiaire de son paramètre.
- Une variable temporaire conserve une valeur pendant un échange.
- Utilise des tableaux pour un nombre fixe de cases et des ArrayList lorsque le nombre d’éléments change.
- Convertis un tableau de valeurs primitives en une liste de valeurs enveloppées avec une boucle.
3Traite des listes et des tableaux avec des boucles
Les boucles transforment des valeurs stockées en résultats utiles : une somme, un effectif, un extremum, une collection filtrée ou un résultat de recherche. Choisis comment parcourir les éléments selon que tu as besoin des valeurs ou des positions. Suis l’évolution de l’état de chaque boucle pour gérer les données vides, conserver la partie fractionnaire des moyennes, arrêter une recherche au bon moment et supprimer des valeurs sans manquer les éléments qui se décalent.
3.1 Choisis une boucle à indice ou une boucle for-each
Une boucle permet à un même morceau de code de traiter chaque élément. Le choix dépend de ce dont le corps de la boucle a besoin : seulement une valeur, sa position ou un moyen de modifier la collection. Les tableaux comme les ArrayList prennent en charge les boucles à indice et les boucles for-each.
Parcours les valeurs dans l’ordre
for (String task : tasks) {
System.out.println(task);
}
Lis ceci comme « pour chaque tâche dans tasks ». Avec [shop, cook, clean], le code affiche les trois chaînes dans cet ordre. La variable de boucle a le type des éléments. Pour ArrayList<Integer>, utilise int pour convertir automatiquement chaque valeur enveloppée en valeur primitive ou Integer pour conserver la référence à l’objet enveloppe. Pour les caractères d’une chaîne, for (char c : word.toCharArray()) parcourt les valeurs char.
Une boucle for-each ne fournit pas d’indice. Si tu as besoin de lignes numérotées, utilise une boucle à indice :
for (int i = 0; i < tasks.size(); i++) {
System.out.println((i + 1) + ". " + tasks.get(i));
}
L’indice commence à 0, mais le numéro de ligne affiché commence à 1. Les parenthèses font de i + 1 une addition avant que son résultat ne devienne une partie du texte. Pour un tableau, remplace la condition par i < tasks.length et lis tasks[i]. Une boucle while peut faire le même travail en initialisant un compteur avant la boucle et en l’incrémentant dans le corps.
Modifie une valeur par sa position
int[] nums = {4, 9, 2};
for (int n : nums) {
n = n * 2;
}
Ce code laisse le tableau inchangé. Chaque passage place une copie d’une valeur primitive dans n ; affecter une valeur à cette variable locale ne modifie pas la case d’origine. Pour modifier le tableau :
for (int i = 0; i < nums.length; i++) {
nums[i] = nums[i] * 2;
}
Le résultat est [8, 18, 4]. Pour une liste d’entiers, la mise à jour correspondante est list.set(i, list.get(i) * 2). L’indice indique à Java quel élément stocké remplacer.
Adapte les bornes au corps de la boucle
Pour parcourir une liste à l’envers, commence à tasks.size() - 1, continue tant que i >= 0 et utilise i--. Le parcours visite clean, cook, puis shop. Pour prendre un élément sur deux, tu peux utiliser i += 2 dans une boucle qui avance.
Les comparaisons avec un voisin nécessitent un intervalle plus court. Si le corps lit à la fois list.get(i) et list.get(i + 1), la condition est i < list.size() - 1. La dernière position de départ valide est l’avant-dernier élément. Utiliser la condition habituelle d’un parcours complet essaierait de lire un voisin inexistant après le dernier élément.
Lorsque tu traites ensemble deux listes de même longueur, utilise un indice pour accéder aux deux. Par exemple, names.get(i) et scores.get(i) désignent les entrées correspondantes. Une boucle for-each est plus simple lorsque la position ne joue aucun rôle, par exemple pour afficher chaque nom ou ajouter chaque valeur à une somme.
Commencer à 1 saute le premier élément sans avertissement. Utiliser <= size() ou <= length essaie d’accéder à un indice supplémentaire invalide. Une liste ou un tableau vide ne nécessite aucune règle particulière de parcours : la condition initiale est fausse, donc le corps ne s’exécute aucune fois. Tout code ultérieur qui divise par l’effectif ou lit un élément doit gérer lui-même ce cas vide.
Points clés
- Une boucle for-each est utile lorsque son corps n’a besoin que de chaque valeur.
- Utilise un indice pour écrire des valeurs stockées, suivre des positions ou comparer des voisins.
- Affecter une valeur à une variable for-each ne remplace pas un élément de tableau ou de liste.
- L’accès au voisin à
i + 1nécessitei < size() - 1. - Un parcours normal d’une collection vide ne s’exécute aucune fois.
3.2 Calcule un résultat à partir de plusieurs éléments
Un accumulateur conserve un résultat construit au fil des passages dans une boucle. Initialise-le avant la boucle, mets-le à jour à l’intérieur, puis utilise-le après. La valeur initiale dépend de la tâche : une somme ou un effectif commence à 0, tandis qu’un maximum nécessite un élément réel.
Sommes et moyennes
int sum = 0;
for (int value : numbers) {
sum += value;
}
if (!numbers.isEmpty()) {
double average = (double) sum / numbers.size();
System.out.println(average);
}
Pour [4, 7, 8], sum passe de 0 à 4, puis à 11 et enfin à 19. Les deux opérandes de sum / numbers.size() seraient des entiers, ce qui donnerait 6. Effectuer un transtypage de sum avant la division donne environ 6,33. Convertir le quotient déjà calculé ne ferait que transformer le 6 tronqué en 6,0.
Une collection vide n’a pas de moyenne ordinaire. La division entière par zéro provoque une ArithmeticException ; la division en virgule flottante 0.0 / 0 donne NaN. Décide de ce que signifie le cas vide pour le programme avant de diviser, par exemple afficher « Aucune mesure ». Pour les distances décimales [5.0, 7.5, 10.0] km, une somme de type double vaut 22,5 km et la moyenne est de 7,5 km.
Compte seulement les correspondances
Un comptage conditionnel commence à 0 et ne s’incrémente que lorsque son test réussit. Pour les températures {22, 27, 31, 24, 26} en degrés Celsius, if (t > 25) { count++; } donne 3. Place l’initialisation en dehors de la boucle ; remettre count à zéro à chaque passage ferait perdre les correspondances précédentes.
Trouve un extremum et sa position
Pour un tableau non vide, commence par int max = values[0];. Remplace max chaque fois qu’une valeur parcourue est plus grande. Commencer à 0 échoue pour {-5, -2, -9} : le résultat indiqué est 0 alors qu’aucun élément n’a cette valeur. Commencer par -5 permet à la boucle de trouver le bon maximum, -2. Un minimum utilise le même schéma avec <.
Quand la position compte, conserve le meilleur indice :
int best = 0;
for (int i = 1; i < numbers.size(); i++) {
if (numbers.get(i) > numbers.get(best)) {
best = i;
}
}
Pour [4, 7, 8], best vaut 2 à la fin et numbers.get(best) vaut 8. La boucle commence à 1 car l’indice 0 est déjà le candidat initial. Avec >, une valeur égale ne remplace pas le candidat actuel, ce qui conserve le premier maximum. Avec >=, chaque égalité le remplace, ce qui conserve le dernier maximum. Vérifie que la collection n’est pas vide avant de créer un candidat à l’indice 0.
Collecte les valeurs correspondantes
Le filtrage utilise une liste de résultat vide comme accumulateur. Parcours chaque mot, ajoute-le lorsque word.length() > 4 et renvoie le résultat. Pour [sun, planet, moon, galaxy], le résultat est [planet, galaxy]. Lire l’entrée et ajouter les éléments à une liste distincte laisse l’entrée inchangée.
Pour deux éléments Integer, == compare l’identité des objets. Les petites valeurs mises en cache peuvent masquer cette erreur ; des valeurs plus grandes égales peuvent être des objets différents. Compare-les avec equals ou convertis-les d’abord en valeurs primitives dans des variables int. Les opérateurs numériques <, >, <= et >= convertissent les valeurs enveloppées en valeurs primitives : le code qui cherche le meilleur indice compare donc leurs nombres.
Points clés
- Initialise un accumulateur avant la boucle et mets-le à jour à l’intérieur.
- Effectue un transtypage avant la division entière pour conserver la partie fractionnaire d’une moyenne.
- Vérifie que la collection n’est pas vide avant de calculer une moyenne ou de sélectionner un extremum.
- Initialise un maximum ou un minimum à partir d’un élément réel.
>conserve le premier maximum ;>=conserve le dernier.- Le filtrage accumule les correspondances dans une nouvelle liste.
- Utilise l’égalité de valeur pour comparer deux objets Integer.
3.3 Recherche jusqu’à une correspondance ou jusqu’à la fin
Une recherche linéaire vérifie les éléments les uns après les autres. Elle fonctionne quel que soit l’ordre des données. Une recherche de la première correspondance peut s’arrêter dès qu’elle la trouve ; une recherche infructueuse doit atteindre la fin avant de conclure qu’aucun élément ne correspond.
Renvoie le premier indice correspondant
static int indexOfName(ArrayList<String> names, String target) {
for (int i = 0; i < names.size(); i++) {
if (names.get(i).equals(target)) {
return i;
}
}
return -1;
}
Si le premier nom correspondant est à l’indice 2, la méthode vérifie les indices 0, 1 et 2, puis renvoie immédiatement 2. L’instruction return -1 est après la boucle car seul un parcours achevé établit l’absence de correspondance. Placer else { return -1; } à l’intérieur arrêterait la recherche au premier élément non correspondant et ignorerait tous les candidats suivants.
La valeur -1 indiquant l’absence ne peut pas être un indice valide. L’appelant doit la vérifier avant de lire le résultat :
int index = indexOfName(names, "Ahmed");
if (index != -1) {
System.out.println(names.get(index));
}
Le test index > 0 manquerait une correspondance valide à l’indice 0. Utiliser directement -1 dans get provoquerait une exception. Sur une liste vide, le corps de la boucle ne s’exécute jamais et la méthode renvoie correctement -1.
Adapte la comparaison à la tâche
Pour rechercher des valeurs exactes dans une liste, contains et indexOf effectuent déjà une recherche linéaire. Écris une boucle pour un tableau ou une condition comme « commence par L ». Utilise equals ou equalsIgnoreCase pour les chaînes, == pour les valeurs primitives et equals pour deux objets Integer. Un test d’identité de chaînes peut manquer des textes égaux.
Pour String[] cities = {"Oslo", "Lima", "Lagos", "Pune"}, teste cities[i].startsWith("L"). Le test échoue à l’indice 0 et réussit à l’indice 1 : le résultat pour la première correspondance est donc 1. Si la tâche demande toutes les correspondances, ne renvoie pas encore de résultat. Ajoute les indices correspondants à une liste de résultat et termine le parcours ; cela donne [1, 2]. Pour compter les correspondances, incrémente un compteur au lieu de stocker les positions.
Choisis la forme de la réponse
Une recherche dont la réponse est oui ou non peut commencer par boolean found = false;. En cas de correspondance, donne-lui la valeur true et quitte la boucle avec break. Sans cette sortie, la réponse finale reste vraie mais le programme vérifie des valeurs dont il n’a plus besoin. Une méthode de recherche peut aussi renvoyer immédiatement true et renvoyer false après la boucle.
Renvoyer un élément nécessite un résultat distinct pour « rien trouvé ». Pour une String, il s’agit souvent de null ; l’appelant doit le vérifier avant d’appeler une méthode de String. Renvoyer un indice avec -1 rend le cas d’absence visible sans prétendre qu’une chaîne vide est une donnée absente.
Compte le travail réellement effectué par la recherche
Une valeur recherchée à la première position nécessite une comparaison. À la troisième position, elle en nécessite trois. Une valeur absente parmi 10 000 noms nécessite les 10 000 comparaisons. La première comparaison infructueuse ne permet pas d’établir que la valeur recherchée est absente des positions restantes. Une recherche de toutes les correspondances vérifie aussi chaque élément, même après une correspondance précoce, car des valeurs ultérieures peuvent également correspondre.
Points clés
- La recherche linéaire parcourt les éléments dans l’ordre et fonctionne quel que soit l’ordre des données en entrée.
- Renvoie un indice à la première correspondance ; ne renvoie -1 qu’après la boucle.
- Utilise la comparaison adaptée au type des éléments.
- Une recherche de toutes les correspondances poursuit le parcours après une correspondance.
- Vérifie la valeur indiquant l’absence avant d’utiliser le résultat de la recherche.
3.4 Supprime des éléments sans en sauter
Supprimer des éléments d’une ArrayList modifie les positions que la boucle cherche à parcourir. La méthode sûre dépend de ton objectif : modifier la liste d’origine ou construire un résultat distinct. Remplacer des valeurs est plus simple car les positions restent en place.
Observe comment une boucle qui avance saute une valeur
Supposons qu’une boucle supprime les nombres pairs de [3, 8, 8, 5] et incrémente toujours i. À l’indice 1, elle supprime le premier 8. Le deuxième 8 glisse à l’indice 1, mais le passage suivant utilise l’indice 2. Le résultat est [3, 8, 5] : il reste un nombre pair. La condition était correcte ; c’est le déplacement après la suppression qui a posé problème.
Une boucle for-each sur une ArrayList ne doit pas non plus ajouter ou supprimer des éléments par l’intermédiaire de la liste. Elle utilise un itérateur dont l’état de parcours ne correspond plus à la liste modifiée. Java signale généralement une ConcurrentModificationException. Certaines modifications peuvent au contraire terminer la boucle sans avertissement et laisser un élément non parcouru. L’absence d’exception ne rend pas cette modification sûre.
Supprime à l’envers pour garder stables les positions non vérifiées
for (int i = numbers.size() - 1; i >= 0; i--) {
if (numbers.get(i) % 2 == 0) {
numbers.remove(i);
}
}
Pour [3, 8, 8, 5], l’indice 3 contient 5 et reste inchangé. L’indice 2 contient 8, qui est supprimé. L’indice 1 contient toujours l’autre 8, qui est supprimé ensuite. L’indice 0 contient 3 et reste inchangé. Le résultat est [3, 5]. Une suppression décale les éléments à droite de l’indice actuel, que cette boucle inverse a déjà vérifiés.
Construis la liste des valeurs à conserver
Lorsque l’original doit rester inchangé, crée une nouvelle liste :
ArrayList<Integer> odds = new ArrayList<>();
for (int value : numbers) {
if (value % 2 != 0) {
odds.add(value);
}
}
Cette boucle for-each est sûre car elle lit numbers et ajoute à une autre liste. Avec [3, 8, 8, 5] en entrée, odds contient [3, 5] et l’entrée contient toujours les quatre valeurs. Un tableau ne peut pas non plus rétrécir ; filtrer ses valeurs nécessite également un nouveau tableau ou une nouvelle liste.
Laisse un itérateur gérer sa propre suppression
Iterator<Integer> it = numbers.iterator();
while (it.hasNext()) {
if (it.next() % 2 == 0) {
it.remove();
}
}
Importe java.util.Iterator. next() fournit l’élément suivant et it.remove() supprime l’élément qui vient d’être renvoyé tout en gardant cohérente la position de l’itérateur. Ne remplace pas cet appel par numbers.remove(...) dans cette boucle.
Une boucle while qui avance peut aussi fonctionner en incrémentant seulement lorsqu’aucun élément n’a été supprimé. Après une suppression, elle doit examiner à nouveau le même indice, où l’élément suivant est arrivé. Cela demande plus d’attention qu’une boucle inverse ou une nouvelle liste de résultat.
Les remplacements et les ajouts ont des effets différents
set(i, value) est sûr dans une boucle à indice car il ne change ni la taille ni les positions. Ajouter un élément à chaque passage tout en testant i < list.size() peut repousser indéfiniment la fin. Enregistre int originalSize = list.size(); et limite la boucle à cette borne lorsque chaque élément d’origine doit entraîner l’ajout d’une valeur.
Points clés
- Une suppression dans un parcours qui avance, suivie de
i++, saute l’élément décalé à la place de l’élément supprimé. - Une boucle inverse permet de supprimer par indice sans erreur.
- Filtrer dans une autre liste préserve l’originale.
- Pendant le parcours avec un itérateur, utilise sa propre méthode
remove. - Un parcours for-each ne doit pas ajouter ou supprimer des éléments par l’intermédiaire de sa liste source.
- Limite les boucles d’ajout à la taille d’origine lorsqu’elles ne traitent que les éléments d’origine.
4Manipule du texte avec les méthodes de String
Le texte arrive sous forme de caractères, mais un programme a souvent besoin de noms, de nombres ou de certaines parties d’une ligne. Lis les positions avec les méthodes de String, trouve un séparateur avant de découper le texte et transforme les champs séparés en valeurs utilisables dans des calculs. Suis les résultats renvoyés : les chaînes sont immuables, et nettoyer une chaîne n’aide le code ultérieur que si ce code utilise le texte nettoyé.
4.1 Lis les caractères et conserve les résultats des méthodes de String
Une String stocke du texte sous forme de séquence de valeurs char. Les indices commencent à 0, comme pour les tableaux et les listes. Un objet String ne peut pas changer après sa création : les méthodes qui produisent un texte modifié renvoient donc un résultat que tu dois conserver.
Un caractère est différent d’une chaîne
"Hello".length() vaut 5. "Hello".charAt(0) vaut 'H' et charAt(4) vaut 'o'. Un char utilise des apostrophes et contient une unité de code UTF-16 ; une String utilise des guillemets doubles et peut contenir zéro, une ou plusieurs de ces unités. "Java".charAt(0) == 'J' compare deux caractères primitifs. Comparer ce char avec "J" ne compile pas car les types diffèrent.
charAt(length()) dépasse la fin et provoque une StringIndexOutOfBoundsException. Même charAt(0) échoue pour "". Vérifie isEmpty() avant de lire le premier caractère d’une saisie.
length() compte les valeurs char UTF-16, qui ne correspondent pas toujours à des symboles affichés entiers. "café".length() vaut 4 ; "Hi 👋".length() vaut 5 car l’émoji de la main qui salue occupe deux positions char. Utilise ce décompte pour raisonner sur les indices de ces méthodes.
Parcours et teste les caractères
String text = "Programming in Java".toLowerCase();
int vowels = 0;
for (int i = 0; i < text.length(); i++) {
char c = text.charAt(i);
if ("aeiou".indexOf(c) >= 0) {
vowels++;
}
}
La conversion en minuscules permet au même test d’appartenance de reconnaître les voyelles majuscules et minuscules. Chaque indexOf(c) est positif ou nul lorsque le caractère apparaît dans "aeiou". Le compte atteint 6 : o, a, i, i, a, a. for (char c : text.toCharArray()) peut parcourir les mêmes valeurs sans indice.
La classe Character fournit des tests comme isLetter, isDigit, isWhitespace et isUpperCase. Character.isDigit('7') vaut true, tandis que Character.isLetter('7') vaut false. Character.toUpperCase(c) et toLowerCase(c) renvoient des valeurs char converties.
Les caractères ont aussi des codes numériques. 'a' + 1 produit l’int 98 ; (char) ('a' + 1) convertit ce code en 'b'. Pour un caractère représentant un chiffre ASCII, soustraire '0' donne sa valeur : '7' - '0' vaut 7. Soustraire le code de zéro fonctionne car les codes de ces chiffres sont consécutifs.
Lis la concaténation de gauche à droite
| Expression | Résultat |
|---|---|
"Total: " + 3 + 4 | "Total: 34" |
3 + 4 + " items" | "7 items" |
"Total: " + (3 + 4) | "Total: 7" |
Dès que le côté gauche de + est du texte, le nombre suivant est assemblé comme du texte. Les parenthèses imposent l’addition numérique avant l’assemblage. Pour quelques assemblages dans une expression, + est une solution claire.
Enregistre le texte renvoyé
String name = "Lena";
name.toUpperCase();
System.out.println(name);
name = name.toUpperCase();
L’affichage montre toujours "Lena" : l’appel dont le résultat a été ignoré n’a pas modifié son objet. L’affectation fait ensuite référencer "LENA" par name. L’immuabilité des chaînes signifie que l’ancien texte reste inchangé même si d’autres variables le référencent. Conserver le résultat et modifier l’objet d’origine sont deux opérations différentes.
Points clés
charAt(i)renvoie un char ; les indices valides vont jusqu’àlength() - 1.- Les char utilisent des apostrophes ; les chaînes utilisent des guillemets doubles.
- La longueur d’une String compte les valeurs char UTF-16, donc certains symboles occupent deux positions.
- Les méthodes de
Charactertestent et convertissent des valeurs char individuelles. - L’assemblage de chaînes avec
+s’effectue de gauche à droite. - Stocke le résultat d’une transformation de String.
4.2 Recherche et extrais des parties de texte
Le traitement de texte suit souvent une courte séquence : trouver un repère, vérifier qu’il existe, puis extraire la partie nécessaire. Des opérations de nettoyage peuvent préparer le texte avant une recherche ou une comparaison. Chaque opération sur une String renvoie un résultat sans modifier son objet d’origine.
Trouve des positions ou pose une question à réponse oui ou non
Pour "banana", indexOf('a') renvoie 1, indexOf("a", 2) renvoie 3 et lastIndexOf('a') renvoie 5. Le deuxième argument choisit où commence la recherche vers l’avant. Une recherche infructueuse donne -1, comme dans indexOf("x").
Utilise contains(text) lorsque tu as seulement besoin de savoir si un texte apparaît. startsWith(prefix) vérifie le début et endsWith(suffix) la fin. "report.pdf".endsWith(".pdf") vaut true. Ces recherches sont sensibles à la casse : "Hello".contains("hello") vaut false. Les méthodes de recherche d’indice acceptent un char ou une String ; contains prend du texte.
Une sous-chaîne s’arrête juste avant son indice de fin
String word = "programming";
String middle = word.substring(3, 7);
String tail = word.substring(3);
middle vaut "gram", avec les positions 3, 4, 5 et 6. Sa longueur est 7 - 3, soit 4. tail vaut "gramming", car omettre l’argument de fin permet d’aller jusqu’à la fin de la chaîne. Le début doit être positif ou nul et ne pas dépasser la fin ; la fin ne peut pas dépasser length(). Des bornes invalides provoquent une StringIndexOutOfBoundsException.
Pour une adresse électronique, trouve le séparateur avant l’extraction :
String email = "lena.ito@example.com";
int at = email.indexOf("@");
if (at != -1) {
String user = email.substring(0, at);
String domain = email.substring(at + 1);
}
Le séparateur est à l’indice 8. La première extraction se termine avant lui et donne "lena.ito" ; la seconde commence après lui et donne "example.com". Si le repère est absent, at vaut -1. Appeler substring(0, at) sans vérification échouerait. Commencer la seconde extraction à at conserverait le @ dans le domaine.
Nettoie seulement ce que l’opération vise
| Méthode | Effet |
|---|---|
toUpperCase() / toLowerCase() | Renvoyer le texte avec une casse modifiée |
trim() | Supprimer au début et à la fin les caractères dont le code va jusqu’à U+0020 |
strip() | Supprimer au début et à la fin les caractères blancs reconnus par Character.isWhitespace |
replace(target, replacement) | Remplacer chaque occurrence littérale |
repeat(n) | Assembler n copies du texte |
" hello ".trim() donne "hello" ; les espaces intérieurs restent. strip() traite des caractères blancs Unicode supplémentaires comme le cadratin. Cette méthode utilise la définition des caractères blancs de Java, qui n’inclut pas tous les caractères ressemblant à un espace. "banana".replace('a', 'o') donne "bonono". "ab".repeat(3) donne "ababab".
Vide et blanc sont différents
isEmpty() teste si la longueur est 0. isBlank() accepte aussi un texte composé uniquement de caractères blancs au sens de Java. Pour " ", la première méthode renvoie false et la seconde true. Utilise le test adapté à la règle de saisie. Pour nettoyer une réponse comme " Yes ", answer.trim().toLowerCase() renvoie "yes". Stocke ce texte renvoyé si la variable doit conserver la valeur nettoyée ; un simple answer.trim(); l’ignore.
Points clés
- Les recherches de position renvoient -1 lorsqu’un repère est absent.
substring(begin, end)inclut begin et exclut end.- Vérifie une position trouvée avant de l’utiliser comme borne d’extraction.
replaceremplace du texte littéral ;trimetstripagissent aux extrémités.isBlankaccepte un texte composé uniquement de caractères blancs, tandis queisEmptynécessite une longueur de 0.
4.3 Transforme une ligne de texte en champs utilisables
Une ligne de données peut contenir plusieurs valeurs séparées par une virgule ou un autre repère. Le découpage produit un tableau de chaînes ; l’analyse syntaxique convertit ensuite certains champs en nombres. Vérifie la structure des données avant d’utiliser leurs positions.
Découpe en un tableau
String[] fields = "Ada,36,London".split(",");
Il y a trois champs : "Ada", "36" et "London". Les virgules ne sont pas conservées. fields.length vaut 3 et fields[1] est toujours du texte, pas un nombre.
Le séparateur transmis à split est une expression régulière, un motif qui n’est pas toujours du texte littéral. Une virgule représente une virgule, mais ., |, *, + et ? ont des significations particulières. Pour découper une chaîne de version sur des points littéraux, utilise "1.5.2".split("\\."). Deux barres obliques inverses dans la chaîne Java produisent l’unique barre oblique inverse du motif qui rend le point littéral. split("."), au contraire, correspond à des caractères individuels et produit un tableau vide dans cet exemple.
Gère les espaces et les parties vides
Découper "a b" sur " " produit trois parties : "a", "" et "b". Chaque séparateur est un espace, donc des espaces adjacents laissent une partie vide entre eux. Pour des suites de caractères blancs, utilise :
String[] words = " red green blue ".trim().split("\\s+");
Le résultat est [red, green, blue]. Nettoyer d’abord avec trim évite une première partie vide due à un séparateur initial. Par défaut, split supprime les parties vides finales : "a,b,,".split(",") ne donne que "a" et "b". Compte les champs réellement obtenus avant d’accéder à leurs indices.
Convertis chaque champ dans le type voulu
Integer.parseInt("42") renvoie l’int primitif 42. Integer.valueOf("-7") renvoie un objet Integer. Double.parseDouble("5.2") renvoie 5,2, en utilisant un point comme séparateur décimal quels que soient les paramètres régionaux de l’ordinateur. L’analyse d’un entier accepte du texte représentant un entier sans point décimal. Integer.parseInt("4.5") échoue au lieu d’arrondir.
Nettoie les champs avec trim avant leur analyse, surtout le texte représentant un entier : Integer.parseInt(" 42") provoque une NumberFormatException. Le découpage sur les virgules ne supprime pas les espaces autour des champs. Un nombre de champs correct ne garantit pas non plus qu’un champ contient un nombre valide.
Lis un enregistrement complet
String line = "Amira,10.5,63";
String[] parts = line.split(",");
if (parts.length == 3) {
String name = parts[0].trim();
double distanceKm = Double.parseDouble(parts[1].trim());
int minutes = Integer.parseInt(parts[2].trim());
double pace = minutes / distanceKm;
System.out.println(name + ": " + pace + " min/km");
}
La distance est de 10,5 km, le temps est de 63 minutes et l’allure est de 6,0 min/km. La ligne incomplète "Amira,10.5" ne contient que deux champs ; sans la vérification du nombre de champs, parts[2] provoquerait une ArrayIndexOutOfBoundsException. Un programme peut ignorer ou signaler cet enregistrement incomplet avant d’utiliser une position manquante.
Convertis ou assemble à nouveau du texte
String.valueOf(42) et Integer.toString(42) donnent tous deux "42". String.join(", ", List.of("Oslo", "Lima", "Pune")) donne "Oslo, Lima, Pune", en insérant des séparateurs uniquement entre les parties. La méthode accepte une liste, un tableau ou des chaînes transmises en arguments séparés. L’assemblage ne fait ni analyse syntaxique ni calcul : il combine les chaînes fournies.
Points clés
splitrenvoie un tableau de String et traite son séparateur comme un motif.- Échappe un point littéral sous la forme
"\."dans le code Java. - Utilise trim avant de découper sur des suites de caractères blancs et avant de convertir des champs entiers.
- Par défaut, split supprime les champs vides finaux.
- Vérifie le nombre de champs et le texte numérique avant d’utiliser les données converties.
- Utilise
String.joinpour les parties de texte et les méthodes d’analyse syntaxique pour les nombres.
5Compare correctement des chaînes et construis du texte efficacement
Des textes qui semblent égaux peuvent appartenir à des objets String différents. Choisis une comparaison adaptée à la tâche : égalité de contenu, égalité sans tenir compte de la casse ou ordre des caractères de Java. Construis et modifie ensuite des textes plus longs avec StringBuilder. Suivre les références et les valeurs renvoyées t’aide à prévoir si une opération modifie un texte existant, crée un résultat ou compare simplement deux objets.
5.1 Compare le contenu et l’ordre des chaînes
Deux variables peuvent contenir du texte avec les mêmes caractères sans référencer le même objet String. Choisis une comparaison selon la question posée : égalité des contenus, égalité des contenus sans tenir compte de la casse, ou texte qui vient en premier dans l’ordre de Java.
Utilise equals pour les contenus
String answer = new String("yes");
System.out.println(answer == "yes");
System.out.println(answer.equals("yes"));
Le premier résultat est false : l’objet créé séparément n’est pas celui du littéral. Le second est true car les caractères correspondent. Des littéraux identiques comme dans "yes" == "yes" partagent un objet et peuvent donner l’impression que la comparaison d’identité est fiable. Un texte obtenu à l’exécution peut utiliser des objets nouveaux ou existants : l’identité ne permet donc pas de tester si une saisie correspond.
equalsIgnoreCase ignore la casse des lettres : "YES".equalsIgnoreCase("yes") vaut true. La méthode ne supprime pas les espaces. Pour accepter aussi les espaces autour de la saisie, nettoie-la avant la comparaison.
Pour une variable qui peut valoir null, appelle la méthode sur un littéral connu qui n’est pas null : "yes".equals(answer) renvoie false pour null. answer.equals("yes") provoque une NullPointerException si answer vaut null, car aucun objet ne reçoit l’appel.
Une boucle de commande peut tester !command.equals("quit"). Le ! inverse le résultat de l’égalité de contenu. command != "quit" teste les références et peut maintenir une boucle en cours même lorsque les caractères saisis sont « quit ».
Interprète le signe de compareTo
a.compareTo(b) compare les valeurs char UTF-16 dans l’ordre. La méthode renvoie un nombre négatif si a vient avant b, zéro si les chaînes sont égales et un nombre positif si la première vient après. Seul le signe compte pour l’ordre ; le résultat n’est pas nécessairement exactement -1 ou 1.
| Comparaison | Signe | Raison |
|---|---|---|
"apple".compareTo("banana") | Négatif | Le premier char différent vient avant |
"pear".compareTo("pear") | Zéro | Tous les caractères correspondent |
"car".compareTo("carpet") | Négatif | Préfixe égal, chaîne plus courte en premier |
"10".compareTo("9") | Négatif | '1' vient avant '9' |
Les nombres stockés sous forme de texte ne suivent donc pas l’ordre numérique. Convertis-les lorsque la tâche porte sur des nombres. Les lettres majuscules anglaises non accentuées précèdent les minuscules non accentuées, donc "Zebra" vient avant "apple". Dans cet ordre, "Émile", avec sa lettre accentuée, vient après "Zoe". compareToIgnoreCase ignore la casse ; un classement selon les règles d’un dictionnaire propre à une langue nécessite java.text.Collator.
Réutilise le schéma du minimum pour les noms
Pour une liste non vide [Mia, Ahmed, Lucia] :
String first = names.get(0);
for (String name : names) {
if (name.compareTo(first) < 0) {
first = name;
}
}
"Mia" est le candidat initial. "Ahmed" vient avant et devient le candidat ; "Lucia" ne le remplace pas. Le résultat est "Ahmed". Vérifie que la liste n’est pas vide avant de lire son premier élément.
Un char individuel est une valeur primitive, donc word.charAt(0) == 'A' est une comparaison correcte de caractères une fois que l’on sait que le mot n’est pas vide. Le problème avec == concerne l’identité des objets, pas toutes les comparaisons impliquant du texte.
Points clés
- Utilise
equalspour le contenu des String etequalsIgnoreCasepour ignorer la casse. - Un littéral connu peut recevoir un appel à
equalssans erreur lorsque l’argument peut valoir null. ==vérifie l’identité des String, même lorsque le partage des littéraux masque l’erreur.- Lis seulement le signe de
compareTo. - L’ordre des chaînes en Java est l’ordre UTF-16, et non l’ordre numérique ou celui d’un dictionnaire propre à une langue.
5.2 Construis et modifie du texte avec StringBuilder
Un StringBuilder contient du texte modifiable. Il est utile lorsqu’une boucle ajoute de nombreux morceaux ou lorsque des caractères doivent être modifiés en place. Pour quelques assemblages dans une expression, + est clair, mais reconstruire sans cesse une String qui grandit peut copier son contenu accumulé de nombreuses fois.
Ajoute des morceaux et termine par une String
StringBuilder sb = new StringBuilder();
for (int i = 1; i <= 5; i++) {
if (i > 1) {
sb.append(", ");
}
sb.append(i);
}
String result = sb.toString();
Aucune importation n’est nécessaire. append ajoute des chaînes, des char, des nombres ou des booléens à la fin. Le premier passage ajoute seulement 1 ; le deuxième ajoute ", " puis 2. Le résultat est "1, 2, 3, 4, 5". Placer un séparateur après chaque nombre laisserait un séparateur indésirable à la fin. Pour une liste de chaînes existante, String.join(", ", list) gère directement les séparateurs.
Répéter text += piece dans une boucle crée de nouveaux résultats String immuables. Le préfixe accumulé doit être inclus chaque fois, donc la quantité copiée peut croître de façon quadratique à mesure qu’un long résultat grandit. Un constructeur de chaîne conserve un tampon modifiable et y ajoute des éléments sans reconstruire tout le préfixe à chaque passage.
Modifie des positions et des portions
| Méthode | Effet |
|---|---|
insert(i, x) | Insérer à la position i |
delete(start, end) | Supprimer une portion, end exclu |
deleteCharAt(i) | Supprimer un char |
setCharAt(i, c) | Remplacer un char |
replace(start, end, text) | Remplacer une portion, end exclu |
reverse() | Inverser l’ordre du constructeur de chaîne |
length() et charAt(i) lisent le constructeur comme une String. Les indices décrivent son état actuel ; une insertion ou une suppression peut modifier les positions suivantes.
Commence par new StringBuilder("Jva"). insert(1, 'a') produit "Java" ; setCharAt(0, 'j') donne ensuite "java". Pour "2026-10-22", delete(4, 7) supprime les positions 4, 5 et 6, ce qui laisse "2026-22". Remplacer les positions 7 à 9 de "I like tea" par "coffee" donne "I like coffee".
Ne chaîne que les méthodes qui renvoient le constructeur
new StringBuilder().append("a").append(1).append('b').toString() donne "a1b". Les appels à append renvoient le même constructeur, ce qui permet un autre appel. Les méthodes de modification présentées ici renvoient aussi le constructeur, sauf setCharAt, qui renvoie void et nécessite une instruction distincte.
reverse() modifie l’objet receveur. Si sb contient "stressed", alors String r = sb.reverse().toString(); laisse à la fois r et le texte du constructeur avec la valeur "desserts". Pour préserver le constructeur d’origine, inverse un nouveau constructeur créé à partir de son texte.
Compare les contenus finaux
Pour vérifier un palindrome, ajoute la forme minuscule de chaque lettre de "Was it a car or a cat I saw". Le texte nettoyé est "wasitacaroracatisaw". Inverse un nouveau constructeur contenant ce texte, convertis-le en String et compare avec clean.equals(reversed). La comparaison vaut true.
StringBuilder ne redéfinit pas equals pour comparer les contenus. Des constructeurs distincts contenant "abc" ne sont pas égaux selon cette méthode, et un constructeur n’est pas égal à une String. Convertis-les d’abord : sb1.toString().equals(sb2.toString()) compare le texte réel.
Points clés
- Utilise
appendpour construire un long résultat ettoStringpour le terminer. - Place les séparateurs entre les valeurs pour éviter un séparateur final supplémentaire.
- Les modifications agissent sur le constructeur existant ; les fins des portions sont exclues.
setCharAtrenvoie void et ne peut donc pas être chaînée.reversemodifie le constructeur sur lequel tu l’appelles.- Convertis les constructeurs en String avant de comparer leurs contenus.
Listes et tableaux en Java : exemples
1Construis et partage une liste de lecture
13 étapes
- 1IntroductionSuis l’évolution d’une liste de lecture
Une liste de lecture peut commencer vide et grandir au fil des suggestions. Tu vas ajouter des titres, corriger une entrée, supprimer un doublon et transmettre la liste à une méthode. Garde deux questions distinctes en suivant le code : quel élément occupe chaque indice à présent, et quelles variables référencent le même objet liste ? La première explique les changements de position ; la seconde explique les modifications partagées.
- 2ExplicationCrée la collection vide
Importe
java.util.ArrayList, puis crée la liste :ArrayList<String> reading = new ArrayList<>(); reading.add("Orbit"); reading.add("River");Le type des éléments est String. La liste vide atteint la taille 2 et contient
[Orbit, River]. L’indice 0 désigne Orbit et l’indice 1 désigne River. Le diamant<>permet à Java de déduire le type des éléments à partir du côté gauche. - 3ExempleInsère un titre avant un titre stocké
Continue avec la même liste :
reading.add(1, "Cloud"); String old = reading.set(2, "Forest");L’insertion décale River de l’indice 1 à l’indice 2, ce qui donne
[Orbit, Cloud, River]. Le remplacement place ensuite Forest à l’indice 2 et renvoie River dansold. La liste finale est[Orbit, Cloud, Forest]. Contrairement à l’insertion, le remplacement n’a pas changé la taille. - 4DéfiTrouve la position valide suivante
La liste est
[Orbit, Cloud, Forest]. Que se passe-t-il si tu appellesreading.add(3, "Dune")? Que renverrait ensuitereading.get(3)?---reveal---
L’insertion ajoute Dune à la fin car l’indice
size()est autorisé pour une insertion. La taille devient 4, donc l’indice 3 est maintenant valide en lecture et renvoie"Dune". Lire l’indice 3 avant l’insertion aurait échoué. - 5ExplicationSupprime une valeur et suis le décalage
Ajoute un autre Cloud, puis supprime par valeur :
reading.add("Cloud"); boolean removed = reading.remove("Cloud");La liste avant suppression est
[Orbit, Cloud, Forest, Dune, Cloud]. Seul le premier Cloud est supprimé : le résultat est donc[Orbit, Forest, Dune, Cloud]etremovedvaut true. Forest et tous les éléments suivants se décalent d’une position vers la gauche. Le dernier Cloud reste dans la liste. - 6ConseilCherche si un titre existe ou où il se trouve
Pour
[Orbit, Forest, Dune, Cloud],contains("Orbit")vaut true etindexOf("Orbit")vaut 0. Un test de présence doit accepter l’indice 0 : utiliseindex != -1après avoir enregistré le résultat de la recherche. Un titre absent donne -1. Les recherches comparent le contenu des String en tenant compte de la casse, donc rechercher"orbit"ne trouve pas"Orbit". UtiliselastIndexOflorsque la dernière position correspondante compte. - 7DéfiSupprime un nombre par sa valeur
Une
ArrayList<Integer>distincte contient[9, 1, 9]. Tu veux supprimer la première valeur 9. Quel appel convient et que reste-t-il ?---reveal---
numbers.remove(Integer.valueOf(9))sélectionne la suppression par valeur et laisse[1, 9].remove(9)sélectionnerait l’indice 9, qui est invalide. Le type primitif int sélectionne un indice même si la liste elle-même stocke des entiers. - 8AnalogieDeux noms pour un seul carnet
Imagine une référence comme une note indiquant où se trouve un carnet. Copier la note ne crée pas un autre carnet. Avec
ArrayList<String> shared = reading;, les deux variables désignent une même liste, doncshared.add("Coast")est visible parreading. Un constructeur de copie,new ArrayList<>(reading), crée au contraire une autre liste avec ses propres cases. - 9ExempleCopie avant de modifier
Pars de
[Orbit, Forest, Dune, Cloud]:ArrayList<String> copy = new ArrayList<>(reading); copy.remove("Dune");La copie devient
[Orbit, Forest, Cloud], tandis que reading reste inchangée. Les deux listes référençaient initialement les mêmes éléments String immuables, mais leurs cases sont distinctes. Supprimer une case de l’une ne la supprime pas de l’autre. - 10Point cléUn paramètre est un autre nom local
Une méthode reçoit une copie d’une référence de liste. Appeler
titles.clear()par l’intermédiaire de ce paramètre modifie la liste partagée. L’affectationtitles = new ArrayList<>();ne modifie que le nom local, donc l’appelant conserve son ancienne liste. Une liste vide est toujours un objet ; null ne désigne aucun objet. Appelersize()sur une liste vide renvoie 0, tandis qu’un appel par une référence nulle échoue. - 11DéfiDistingue les modifications partagées de la réaffectation locale
La liste d’un appelant est
[North, South]. La méthode exécute ces instructions :titles.remove("North"); titles = new ArrayList<>(); titles.add("East");Que voit encore l’appelant ?
---reveal---
Il voit
[South]. La suppression modifie d’abord l’objet partagé. La réaffectation redirige ensuite uniquement le paramètre de la méthode, donc East est ajouté à une autre liste. La référence de l’appelant n’a jamais été redirigée. - 12DéfiCombine une copie, une recherche et une modification
Soit a contenant
[Lake, Hill], puis exécuteb = new ArrayList<>(a),b.add("Lake")etb.remove(b.indexOf("Lake")). Que contiennent a et b, eta.equals(b)renvoie-t-il true ?---reveal---
La recherche renvoie l’indice 0, donc b devient
[Hill, Lake]. L’original a reste[Lake, Hill]. Les tailles correspondent mais l’ordre diffère, doncequalspour les listes renvoie false. - 13RécapitulatifPrévois une modification de liste
Pour comprendre une modification, identifie d’abord sa cible : une position pour
setou une suppression par indice, une valeur pour une suppression par valeur et une position d’insertion pouradd. Mets ensuite à jour les indices décalés avant de suivre l’appel suivant. Pour prévoir ce qu’une autre variable voit, détermine si elle partage la liste ou contient une copie distincte. Une réaffectation dans une méthode affecte son paramètre ; les modifications affectent l’objet que ce paramètre référence à ce moment.
2Stocke et copie des mesures en nombre fixe
10 étapes
Enregistre cette unité pour suivre chaque Leçon Interactive pas à pas.
- 1IntroductionAttribue une case fixe à chaque mesure
- 2ExplicationAlloue les cases
- 3ExempleAffiche les données nécessaires
- 4DéfiLis la dernière case
- 5ExempleSuis un alias
- 6ExempleCrée une copie plus grande
- 7DéfiChoisis une comparaison de contenu
- 8ExempleSauvegarde avant d’écraser
- 9DéfiConserve les anciennes données en agrandissant
- 10RécapitulatifDistingue les modifications de cases du nouveau stockage
3Transforme des mesures en résultats
17 étapes
Enregistre cette unité pour suivre chaque Leçon Interactive pas à pas.
- 1IntroductionAttribue une tâche précise à chaque boucle
- 2ExplicationLis les valeurs ou les positions
- 3DéfiLaisse de la place pour un voisin
- 4ExempleAccumule une somme au fil de la boucle
- 5ExempleDivise en conservant la partie fractionnaire
- 6Point cléUn extremum nécessite un candidat réel
- 7DéfiSuis le dernier maximum en cas d’égalité
- 8ExplicationArrête-toi seulement quand la réponse est connue
- 9ExempleTrouve la première mesure au-dessus d’une borne
- 10DéfiPasse de la première correspondance à toutes les correspondances
- 11ExempleObserve une suppression qui saute un élément en avançant
- 12ExplicationParcours à l’envers pour supprimer
- 13LienPréserve la source par filtrage
- 14ConseilUtilise l’itérateur qui gère le parcours
- 15DéfiDéfinis la borne d’une boucle qui ajoute
- 16DéfiCalcule la moyenne des seules valeurs sélectionnées
- 17RécapitulatifSuis l’état et les règles d’arrêt
4Lis un enregistrement textuel par étapes
14 étapes
Enregistre cette unité pour suivre chaque Leçon Interactive pas à pas.
- 1IntroductionDu texte brut aux données
- 2ExplicationLis un caractère à la fois
- 3ExempleCompte les chiffres dans une notation
- 4DéfiConserve une transformation
- 5ExplicationLocalise d’abord une borne
- 6ExempleCompte les positions incluses
- 7ConseilChoisis la règle de nettoyage
- 8DéfiGère un séparateur absent
- 9ExplicationDécoupe l’enregistrement en champs
- 10ExempleConvertis et calcule
- 11Point cléLes séparateurs peuvent décrire des motifs
- 12DéfiAnalyse après avoir vérifié la structure
- 13DéfiNormalise des mots et assemble-les
- 14RécapitulatifVérifie le type du résultat à chaque étape
5Compare des commandes et assemble un compte rendu
12 étapes
Enregistre cette unité pour suivre chaque Leçon Interactive pas à pas.
- 1IntroductionCompare selon le sens et construis un résultat
- 2ExplicationChoisis un test de contenu
- 3ExempleIgnore la casse sans ignorer les espaces
- 4DéfiExplique un test fondé sur des littéraux
- 5ExplicationClasse selon le premier char différent
- 6DéfiConserve le candidat textuel qui vient en premier
- 7ExplicationAjoute à une séquence modifiable unique
- 8ExemplePlace les séparateurs entre les parties
- 9ExempleModifie les positions actuelles
- 10DéfiConserve l’ordre d’origine
- 11DéfiConstruis un compte rendu filtré
- 12RécapitulatifUtilise l’opération adaptée à la question
Listes et tableaux en Java : QCM
Série 1 : Suis l’exécution des boucles et traite du texte10 Questions Pratiques
Question 1 sur 10
for (int n : values) { n += 3; } sur le tableau {2, 6, 9}, que contient le tableau ?Afficher la réponseMasquer la réponse
n. Mettre à jour cette variable locale ne modifie pas une case stockée, donc le tableau reste [2, 6, 9]. Le résultat [5, 9, 12] nécessiterait une boucle à indice qui affecte une valeur à values[i].Question 2 sur 10
[5, 8, 9]. Après avoir calculé leur somme dans un int total, quelle valeur produit (double) (total / values.size()) ?Afficher la réponseMasquer la réponse
(double) total / values.size().Question 3 sur 10
Pour la liste non vide [-8, -3, -3, -6], quelle paire ce code affiche-t-il ?
int best = 0;
int total = 0;
for (int i = 0; i < values.size(); i++) {
int n = values.get(i);
total += n;
if (n >= values.get(best)) {
best = i;
}
}
System.out.println(best + ": " + (double) total / values.size());
Afficher la réponseMasquer la réponse
>= remplace le candidat en cas d’égalité, ce qui conserve l’indice 2. L’indice 1 serait conservé par >, qui rejette les remplacements par une valeur égale.Question 4 sur 10
La méthode est appelée avec {"Birch", "Cedar", "Maple"} et la cible « Maple ». Que renvoie-t-elle ?
static int find(String[] a, String target) {
for (int i = 0; i < a.length; i++) {
if (a[i].equals(target)) return i;
else return -1;
}
return -1;
}
Afficher la réponseMasquer la réponse
else renvoie immédiatement -1. La boucle n’atteint jamais l’indice 2. Une recherche correcte de la première correspondance place le retour signalant l’échec après la boucle, ce qui permet de vérifier chaque candidat avant de déclarer la cible absente.Question 5 sur 10
Quelle liste reste après cette boucle ?
ArrayList<Integer> a = new ArrayList<>(List.of(4, 4, 7, 2));
for (int i = 0; i < a.size(); i++) {
if (a.get(i) % 2 == 0) a.remove(i);
}
Afficher la réponseMasquer la réponse
[4, 7]. Obtenir [7] supposerait que le 4 décalé est vérifié à nouveau, ce que cette incrémentation inconditionnelle empêche.Question 6 sur 10
"Count: " + 2 + 6 ?Afficher la réponseMasquer la réponse
+ a une chaîne à sa gauche, donc il assemble 2 sous forme de texte. Le + suivant assemble 6 à ce texte, ce qui produit "Count: 26". Pour obtenir "Count: 8", il faudrait des parenthèses autour de 2 + 6 afin d’effectuer d’abord l’addition.Question 7 sur 10
String code = "AB:472:Q";, que vaut code.substring(code.indexOf(":") + 1, code.lastIndexOf(":")) ?Afficher la réponseMasquer la réponse
substring(3, 6). Elle inclut les trois chiffres et exclut le deux-points à la fin. Inclure ce dernier deux-points reviendrait à considérer l’indice de fin comme inclus.Question 8 sur 10
"Mina;18;Oslo".split(";") ?Afficher la réponseMasquer la réponse
String[]. Le champ "18" reste du texte tant qu’il n’est pas converti ; split ne déduit pas les nombres. Même si une ArrayList pourrait ensuite contenir les champs, la méthode elle-même renvoie un tableau.Question 9 sur 10
Combien de champs cette expression produit-elle ?
"x,y,,".split(",")
Afficher la réponseMasquer la réponse
split supprime les parties vides à la fin, ce qui laisse "x" et "y". La méthode renvoie donc un tableau de longueur 2. Compter chaque virgule et ajouter un donne quatre positions apparentes, mais ignore la règle de suppression des parties vides finales.Question 10 sur 10
Qu’est-ce qui est affiché ?
String[] p = " Omar, 12, 5 ".trim().split(",");
int distanceKm = Integer.parseInt(p[1].trim());
int hours = Integer.parseInt(p[2].trim());
double speed = distanceKm / hours;
System.out.println(speed);
Afficher la réponseMasquer la réponse
Série 2 : Combine des opérations sur les collections et le texte10 Questions Pratiques
Enregistre cette unité pour voir chaque réponse et t'entraîner sur chaque série.
Question 1 sur 10
" ".isEmpty() et " ".isBlank(), dans cet ordre ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 2 sur 10
Quelles parties cette expression produit-elle ?
" north east west ".trim().split("\\s+")
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 3 sur 10
["zen", "Able", "apple"]. Une boucle conserve le premier candidat et le remplace lorsque name.compareTo(first) < 0. Quel nom reste à la fin ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 4 sur 10
ArrayList<String> a une taille de 4. Que se passe-t-il lorsque add(4, "new") est suivi de get(4) ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 5 sur 10
Quels sont la liste out et la moyenne à la fin ?
int[] a = {-2, 6, 10, 0};
ArrayList<Integer> out = new ArrayList<>();
int sum = 0;
for (int n : a) {
if (n > 0) {
out.add(n);
sum += n;
}
}
double average = (double) sum / out.size();
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 6 sur 10
Quel indice est renvoyé pour l’entrée indiquée ?
static int firstLong(String[] words, int min) {
for (int i = 0; i < words.length; i++) {
String clean = words[i].trim();
if (clean.length() >= min) return i;
}
return -1;
}
// Call:
firstLong(new String[] {" ox ", "pine", " map ", "cedar"}, 4)
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 7 sur 10
Que contiennent a et kept après ce code ?
ArrayList<Integer> a = new ArrayList<>(List.of(2, -1, -1, 5));
ArrayList<Integer> kept = new ArrayList<>(a);
for (int i = kept.size() - 1; i >= 0; i--) {
if (kept.get(i) < 0) kept.remove(i);
}
a.set(0, 9);
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 8 sur 10
La méthode doit renvoyer le texte après le premier « # », ou « missing » lorsqu’il n’y a pas de repère. Quel remplacement permet à la méthode de fonctionner pour les deux entrées « tag#blue » et « plain » ?
static String tail(String s) {
int p = s.indexOf("#");
MISSING
}
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 9 sur 10
Quelle String la méthode renvoie-t-elle pour le tableau {"A", "B", "C"} ?
static String report(String[] parts) {
StringBuilder sb = new StringBuilder();
for (int i = parts.length - 1; i >= 0; i--) {
if (sb.length() > 0) sb.append("/");
sb.append(parts[i]);
}
sb.deleteCharAt(2);
return sb.toString();
}
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 10 sur 10
Que contiennent a et b après change(a) ?
static void change(ArrayList<String> x) {
x.remove("red");
x = new ArrayList<>();
x.add("gold");
}
// In main:
ArrayList<String> a = new ArrayList<>(List.of("red", "blue", "red"));
ArrayList<String> b = a;
change(a);
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Série 3 : Crée, modifie et partage des collections10 Questions Pratiques
Enregistre cette unité pour voir chaque réponse et t'entraîner sur chaque série.
Question 1 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 2 sur 10
Qu’affiche ce code ?
ArrayList<String> tools = new ArrayList<>(List.of("pen", "ruler"));
tools.add(1, "tape");
String old = tools.set(2, "clip");
System.out.println(old + ": " + tools);
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 3 sur 10
ArrayList<Integer> contient [12, 24, 36]. Quel appel supprime la valeur 24 ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 4 sur 10
[Nora, Ravi, Nora, Mei]. Après names.remove("Nora"), que valent names.indexOf("Nora") et names.lastIndexOf("Mei"), dans cet ordre ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 5 sur 10
Que contiennent a et c après ce code ?
ArrayList<String> a = new ArrayList<>(List.of("oak"));
ArrayList<String> b = a;
ArrayList<String> c = new ArrayList<>(a);
b.add("elm");
c.set(0, "ash");
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 6 sur 10
Arrays.toString(new boolean[3]) ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 7 sur 10
double[] readings a une longueur de 6. Quelle expression lit sa dernière case ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 8 sur 10
Que contiennent a et b après ce code ?
int[] a = {7, 3};
int[] b = Arrays.copyOf(a, 3);
b[0] = 8;
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 9 sur 10
{6, 2}. Quels sont les résultats de a.equals(b) et Arrays.equals(a, b), dans cet ordre ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 10 sur 10
Que contient la liste de l’appelant après edit(a) ?
static void edit(ArrayList<Integer> x) {
x.set(0, x.get(0) + 2);
x = new ArrayList<>(x);
x.add(9);
}
// In main:
ArrayList<Integer> a = new ArrayList<>(List.of(5, 8));
edit(a);
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Série 4 : Compare des valeurs et diagnostique des erreurs10 Questions Pratiques
Enregistre cette unité pour voir chaque réponse et t'entraîner sur chaque série.
Question 1 sur 10
reply, qui peut valoir null, contient exactement « ready » ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 2 sur 10
sb.append(3), quel texte contient-il ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 3 sur 10
"18".compareTo("4") < 0, et pourquoi ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 4 sur 10
Quel texte est stocké dans result ?
StringBuilder sb = new StringBuilder("plane");
sb.delete(1, 3);
sb.insert(1, "i");
String result = sb.toString();
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 5 sur 10
Qu’affiche ce code ?
String label = "lamp";
String other = label;
label = label.toUpperCase();
System.out.println(other + ":" + label);
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 6 sur 10
Qu’affiche ce code ?
String[] a = {"ax", "beta", "brim", "sun"};
int first = -1;
int matches = 0;
for (int i = 0; i < a.length; i++) {
if (a[i].startsWith("b")) {
if (first == -1) first = i;
matches++;
}
}
System.out.println(first + ":" + matches);
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 7 sur 10
Quelle liste reste après ce code ?
ArrayList<Integer> a = new ArrayList<>(List.of(2, 5, 2));
for (int i = a.size() - 1; i >= 0; i--) {
if (a.get(i) == 2) a.remove(i);
}
int n = a.size();
for (int i = 0; i < n; i++) {
a.add(a.get(i) * 2);
}
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 8 sur 10
Que valent a et b après l’exécution du code ?
int[] a = {11, 4, 8};
int[] b = a;
int temp = b[0];
b[0] = b[2];
b[2] = temp;
b = Arrays.copyOf(b, 4);
b[1] = 0;
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 9 sur 10
names.indexOf("Iris") >= 0 avant d’appeler get avec ce résultat. Que se passe-t-il ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 10 sur 10
Qu’est-ce qui est affiché ?
StringBuilder a = new StringBuilder("drawer");
StringBuilder b = a;
String result = b.reverse().toString();
b = new StringBuilder("x");
System.out.println(a + ":" + result);
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Tu bloques sur ton propre exercice ? Aide aux Devoirs
Mots-Clés
A
Accumulateur
Ajout en fin
Alias
b = a, b est un alias de a ; b.clear() vide la liste lue par les deux variables.Analyse syntaxique
Integer.parseInt échoue car cette méthode accepte du texte entier sans point décimal.ArrayIndexOutOfBoundsException
ArrayList
Autoboxing
numbers.add(8) même si le type des éléments de la liste est Integer, et non int.B
Borne de boucle
i < a.length - 1 laisse de la place pour lire le voisin à droite avec a[i + 1].Borne de fin exclue
substring(2, 5) inclut les positions 2, 3 et 4 mais exclut la position 5.Boucle à indice
names.get(i) et en affichant i + 1.Boucle for-each
C
Caractères blancs
Character.isWhitespace, également utilisé par strip() et isBlank().Chaînage de méthodes
sb.append("x").append(2), mais ne peut pas se poursuivre à partir de setCharAt, qui renvoie void.Champ
Champ length
new int[4] vaut 4 avant même que le programme écrive des valeurs personnalisées dans ses cases.char
"book".charAt(0) est 'b', tandis que "b" est une String de longueur 1.Classe enveloppe
Integer permet à une ArrayList<Integer> de stocker des nombres fournis sous forme de valeurs int.Comparaison d’identité
a == b vaut false pour des tableaux distincts contenant les mêmes entiers.Comparaison de contenu
reply.equals("go") reconnaît un texte correspondant même lorsque les objets diffèrent.Comparaison sensible à la casse
equals de String constate que « Go » et « go » ont des contenus différents.compareTo
Comptage conditionnel
Concaténation
+ se fait de gauche à droite, sauf si des parenthèses modifient le regroupement."N=" + 2 + 5 produit "N=25", car les nombres sont assemblés une fois que le texte a commencé.ConcurrentModificationException
Copie de tableau
Arrays.copyOf(a, 5) peut agrandir le stockage sans changer la longueur de a.Copie superficielle
D
Découpage
Division entière
17 / 4 ; convertir d’abord un opérande permet d’obtenir le résultat fractionnaire 4,25.É
Égalité de contenu
Arrays.equals(a, b), et non avec equals du tableau.E
Expression régulière
F
Filtrage
I
Immuabilité
toUpperCase().Indice
get(3) lit cet élément.Initialiseur de tableau
int[] a = {3, 6, 9}; crée trois cases contenant ces valeurs.Itérateur
it.remove() tout en poursuivant le parcours de la liste.J
Jointure
String.join("/", pieces) transforme les parties « a », « b » et « c » en texte « a/b/c ».L
Liste non modifiable
List.of("east", "west") refuse un appel ultérieur à set.M
Maximum
{-7, -2, -5} est -2, valeur qu’un meilleur résultat initialisé à zéro ne permettrait pas d’obtenir.Modification en place
reverse() modifie le constructeur d’origine, donc ses alias voient aussi le texte inversé.Modification structurelle
N
NaN
0.0 / 0 produit NaN au lieu d’une mesure utile.null
length() sur une String qu’une recherche peut renvoyer.NumberFormatException
Integer.parseInt(" 18") car l’espace initial n’est pas accepté.O
Ordre lexicographique
P
Palindrome
Parcours
Passage par valeur
Prédicat de recherche
city.startsWith("M") trouve des noms selon une condition plutôt que selon une valeur exacte.R
Recherche linéaire
Référence
Remplacement littéral
replace(".", "-") transforme les points de « a.b.c » en tirets.Résultat de recherche
names.indexOf("Kai") peut être 0 : un test de présence doit donc accepter cet indice.Retour anticipé
S
Sous-chaîne
"planet" est sélectionnée avec substring(1, 4) et donne « lan ».String
StringBuilder
Suppression par indice
[a, b, c] en [a, c] lorsque remove(1) supprime l’élément du milieu.Suppression par parcours inverse
Suppression par valeur
[a, b, a] après que remove("a") a supprimé le premier a.Surcharge de méthode
T
Tableau
U
Unboxing
int first = numbers.get(0); lit un élément Integer de la liste.Unité de code UTF-16
length() de String.V
Valeur par défaut
Valeur sentinelle
Variable temporaire
- 1Premiers programmes Java
- 2Conditions et boucles en Java
- 3Méthodes Java
- 4Listes et tableaux en Java
- 5Classes et objets en Java
- 6Références et égalité en Java
- 7HashMap et collections en Java
- 8Héritage et polymorphisme en Java
- 9Exceptions et fichiers en Java
- 10Paquetages et tests unitaires Java
- 11Généricité et flux en Java
À propos de cette unité
Crée ton propre Matériel d'Étude
Transforme tes notes, diapos et documents en Guides d'Étude, Questions Pratiques, Flashcards et 6 autres outils.