Java – Compter les mots

Vous recevez un texte et vous devez afficher le nombre de fois que chaque mot apparaît. Voici le code de base avec le texte:

public class WordCount {

    public static void main(String[] args) {

        String text = "balcon ecole etagere bonjour allo vive ecole garderie chalet pomme balcon super chaleur chalet ecole as or cuivre salut";

        countAndDisplayWords(text);

    }

    private static void countAndDisplayWords(String text) {

        // TODO Le code pour compter et afficher le résultat

    }

}

Ce que l’application doit afficher:

allo: 1
as: 1
balcon: 2
bonjour: 1
chalet: 2
chaleur: 1
cuivre: 1
ecole: 3
etagere: 1
garderie: 1
or: 1
pomme: 1
salut: 1
super: 1
vive: 1

  • Pour conserver en mémoire le compte pour chaque mot, vous aurez besoin d’une Map<String, Integer> et de son implémentation HashMap.
  • Pour découper chaque mot, vous pouvez utiliser String.split() ou StringTokenizer.
  • Pour mettre en ordre, vous aurez de besoin d’une liste temporaire ainsi que de la méthode Collections.sort().
  • Pour afficher à l’écran, il faut utiliser System.out.println().

Voici une solution utilisant String.split() :

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

public class WordCount {

    public static void main(String[] args) {

        String text = "balcon ecole etagere bonjour allo vive ecole garderie chalet pomme balcon super chaleur chalet ecole as or cuivre salut";

        countAndDisplayWords(text);

    }

    private static void countAndDisplayWords(String text) {

        Map<String, Integer> counter = new HashMap<>();

        // Compter chaque mot
        String[] words = text.split(" ");
        for (String word : words) {
            Integer currentCount = counter.get(word);
            if (currentCount == null) {
                currentCount = 0;
            }

            ++currentCount;
            counter.put(word, currentCount);
        }

        // Obtenir la list en ordre
        List<String> sortedEntries = new ArrayList<>();
        for (Entry<String, Integer> entry : counter.entrySet()) {
            sortedEntries.add(entry.getKey() + ": " + entry.getValue());
        }
        Collections.sort(sortedEntries);

        // Afficher tous les mots
        for (String entry : sortedEntries) {
            System.out.println(entry);
        }

    }
}

Cette solution est simple et efficace, mais si le texte est énorme, cette méthode sera lente et utilisera beaucoup de mémoire puisque chaque mot doit être découpé et conservé en mémoire dans le tableau avant de commencer le compte.

Voici une autre solution utilisant le StringTokenizer.

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.StringTokenizer;

public class WordCount {

    public static void main(String[] args) {

        String text = "balcon ecole etagere bonjour allo vive ecole garderie chalet pomme balcon super chaleur chalet ecole as or cuivre salut";

        countAndDisplayWords(text);

    }

    private static void countAndDisplayWords(String text) {

        Map<String, Integer> counter = new HashMap<>();

        // Compter chaque mot
        StringTokenizer stringTokenizer = new StringTokenizer(text, " ");
        while (stringTokenizer.hasMoreElements()) {
            String word = stringTokenizer.nextToken();

            Integer currentCount = counter.get(word);
            if (currentCount == null) {
                currentCount = 0;
            }

            ++currentCount;
            counter.put(word, currentCount);
        }

        // Obtenir la list en ordre
        List<String> sortedEntries = new ArrayList<>();
        for (Entry<String, Integer> entry : counter.entrySet()) {
            sortedEntries.add(entry.getKey() + ": " + entry.getValue());
        }
        Collections.sort(sortedEntries);

        // Afficher tous les mots
        for (String entry : sortedEntries) {
            System.out.println(entry);
        }

    }
}

Cette solution n’utilise pas un tableau. Le StringTokenizer ne fait qu’avancer d’un mot à l’autre au fur et à mesure que nextToken() est appelé. Cette version utilise moins de mémoire vive et supporte du texte beaucoup plus gros.


Commentaires, questions et suggestions:

Répondre à Williams Annuler la réponse

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *