Compter des mots est l’usage classique d’une map : le mot est la clé et le
nombre d’occurrences est la valeur. En chemin, vous rencontrez le package
strings et la commode valeur zéro d’une map.
Énoncé
Écrivez une fonction countWords(text string) map[string]int qui renvoie le
nombre d’occurrences de chaque mot dans text. Découpez le texte sur les
espaces et comparez les mots sans tenir compte de la casse.
Contraintes :
- La signature doit être
func countWords(text string) map[string]int. - Découpez sur toute suite d’espaces, en ignorant les espaces en trop.
- Considérez
Go,goetGOcomme le même mot (passez-les en minuscules).
Exemple
Pour le texte "the cat sat on the mat", les comptes sont :
cat: 1
mat: 1
on: 1
sat: 1
the: 2
L’ordre de parcours d’une map est aléatoire en Go : les lignes ci-dessus sont triées pour la lisibilité.
Code de départ
package main
import (
"fmt"
"strings"
)
// countWords renvoie le nombre d’occurrences de chaque mot dans text.
func countWords(text string) map[string]int {
counts := make(map[string]int)
// Découpez text en mots et comptez-les.
return counts
}
func main() {
counts := countWords("the cat sat on the mat")
fmt.Println(counts)
}
Indices
Indice 1
strings.Fields découpe sur toute suite d’espaces et supprime les morceaux
vides, ce qui est exactement ce dont vous avez besoin ici.
Indice 2
strings.ToLower(text) avant le découpage rend le comptage insensible à la
casse.
Indice 3
counts[word]++ fonctionne dès la première fois : lire une clé absente renvoie
la valeur zéro 0, et ++ la transforme en 1.
Correction
Afficher la correction
package main
import (
"fmt"
"sort"
"strings"
)
func countWords(text string) map[string]int {
counts := make(map[string]int)
for _, word := range strings.Fields(strings.ToLower(text)) {
counts[word]++
}
return counts
}
func main() {
counts := countWords("the cat sat on the mat")
words := make([]string, 0, len(counts))
for word := range counts {
words = append(words, word)
}
sort.Strings(words)
for _, word := range words {
fmt.Printf("%s: %d\n", word, counts[word])
}
}strings.ToLower normalise la casse pour que The et the comptent ensemble.
strings.Fields découpe le texte sur les espaces et ignore les morceaux vides :
les espaces en trop ne posent donc aucun problème. La map démarre vide, et
counts[word]++ s’appuie sur le fait qu’une clé absente se relit comme 0 : la
première apparition devient 1 et chaque répétition ajoute un. Comme une map
n’a pas d’ordre garanti, main trie les clés avant l’affichage.
Erreurs fréquentes :
- Utiliser
strings.Split(text, " "), qui garde des chaînes vides en cas de doubles espaces.strings.Fieldsévite ce piège. - Oublier de passer en minuscules, de sorte que
Goetgosont comptés comme deux mots différents. - Supposer un ordre d’affichage fixe. L’ordre de parcours d’une map est volontairement aléatoire ; triez les clés si l’ordre compte.
Les maps sont la structure de données centrale ici. Apprenez-les à fond dans Les maps en Go.