Compteur de mots en Go

Comptez le nombre d’occurrences de chaque mot d’un texte avec strings et une map, puis comparez votre programme avec une correction complète et testée.

Niveau
Intermédiaire
Temps estimé
20 min
Notions abordées
strings, maps

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, go et GO comme 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 Go et go sont 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.

Recherche

La recherche s’exécute entièrement dans votre navigateur.