Filtrer et transformer un tableau
Garder seulement les notes au-dessus de 10, mettre tous les prénoms en majuscules, retirer les valeurs nulles... Ces opérations reviennent sans cesse. Elles portent un nom : filtrer et transformer.
Filtrer : ne garder que certains éléments
On crée un tableau vide, puis on y ajoute seulement les éléments qui passent le test :
notes est un tableau vaut [12, 7, 18, 9, 15, 10]
recus est un tableau
pour i de 0 à longueur(notes) - 1
si notes[i] >= 10 alors
recus ajoute notes[i]
fin si
fin pour
affiche joindre(recus, ', ') // 12, 18, 15, 10
affiche longueur(recus) + ' notes sur ' + longueur(notes)
Le tableau d'origine n'est pas modifié : on peut le filtrer à nouveau avec un autre critère.
Transformer : modifier chaque élément
Même principe, mais on ajoute une version modifiée de chaque élément :
prix est un tableau vaut [10, 25, 8, 40]
soldes est un tableau
pour i de 0 à longueur(prix) - 1
soldes ajoute prix[i] * 0.8
fin pour
affiche joindre(soldes, ' ') // 8 20 6,4 32
Le nouveau tableau a autant d'éléments que l'ancien : c'est la différence avec un filtre.
Question : On filtre un tableau de 10 éléments. Combien d'éléments contient le résultat ? — Entre 0 et 10. Un filtre garde les éléments qui passent le test : aucun, quelques-uns ou tous.
Filtrer et transformer à la fois
Les deux opérations s'enchaînent naturellement. Les prénoms de plus de 3 lettres, en majuscules :
prenoms est un tableau vaut ['léa', 'tom', 'inès', 'sam', 'maxime']
resultat est un tableau
pour i de 0 à longueur(prenoms) - 1
si longueur(prenoms[i]) > 3 alors
resultat ajoute majuscules(prenoms[i])
fin si
fin pour
affiche joindre(resultat, ', ') // INÈS, MAXIME
Séparer en deux groupes
Un test, deux tableaux : ceux qui passent, et les autres.
nombres est un tableau vaut [3, 8, 15, 22, 7, 10]
pairs est un tableau
impairs est un tableau
pour i de 0 à longueur(nombres) - 1
si nombres[i] mod 2 = 0 alors
pairs ajoute nombres[i]
sinon
impairs ajoute nombres[i]
fin si
fin pour
affiche 'Pairs : ' + joindre(pairs, ' ') // 8 22 10
affiche 'Impairs : ' + joindre(impairs, ' ') // 3 15 7
Le piège : supprimer pendant le parcours
Et si l'on voulait retirer les éléments dans le tableau lui-même ? Attention : quand on supprime une case, les suivantes reculent d'un rang, et la boucle saute un élément.
La solution : parcourir le tableau à l'envers, de la fin vers le début. Supprimer une case ne dérange alors que celles qu'on a déjà examinées.
valeurs est un tableau vaut [4, 0, 0, 7, 0, 9]
pour i de longueur(valeurs) - 1 à 0 pas -1
si valeurs[i] = 0 alors
valeurs supprime i
fin si
fin pour
affiche joindre(valeurs, ' ') // 4 7 9
Le plus souvent, fabriquer un nouveau tableau filtré est plus simple et plus sûr que supprimer dans le tableau d'origine.
Une fonction de filtre réutilisable
fonction auDessus(liste, seuil)
garde est un tableau
pour i de 0 à longueur(liste) - 1
si liste[i] > seuil alors
garde ajoute liste[i]
fin si
fin pour
retourne garde
fin fonction
temperatures est un tableau vaut [18, 25, 31, 22, 29, 35]
chaudes est un tableau
chaudes vaut auDessus(temperatures, 28)
affiche 'Jours de forte chaleur : ' + longueur(chaudes) // 3
Le seuil est un paramètre : la même fonction sert pour 28 degrés comme pour 30.
En résumé
- Filtrer : un nouveau tableau avec seulement les éléments qui passent un test.
- Transformer : un nouveau tableau avec chaque élément modifié.
- Le tableau d'origine reste intact.
- Pour supprimer dans un tableau pendant qu'on le parcourt, on va de la fin vers le début.