Compter les nombres d'occurrences des mots d'un texte

Objectifs : Manipulation de fichiers

Reprise : Utilisation de la classe Hashtable et de l’interface  Enumeration du paquetage java.util – Gestion des exceptions – Manipulation d’objets Integer et String

A noter : A l’adresse http://java.sun.com/j2se/1.4.1/docs/api/index.html, en TP, consulter la documentation sur les classes des API java.

 

Nous allons lister les différents mots d'un fichier texte en comptant pour chaque mot son nombre d'occurrences. Les mots ne seront pas triés par ordre. Pour exécuter le programme, il faudra indiquer sur la ligne de commande le nom d'un fichier contenant le texte à analyser.

 

1.      Pour réaliser cette application, nous allons utiliser différentes classes du langage java que nous vous proposons de découvrir progressivement.

1.1. La classe BufferedReader

Rappel : Les flots de données sont manipulés en java par un ensemble de classes réparties selon qu’elles traitent :

* des flots d'octets : la classe InputStream et la classe OutputStream

* des flots de caractères : la classe Reader et la classe Writer.

Pour lire le fichier texte, nous allons utiliser la classe BufferedReader du paquetage java.io.

1.1.1.      Consulter la documentation java de la classe BufferedReader et plus particulièrement son constructeur avec argument et sa méthode readLine().

1.1.2.      Compléter le corps de la méthode main() de la classe CompterMot afin d’afficher à l’écran le contenu du fichier donné en argument. Compiler et exécuter.

import java.io.*;

 

public class CompterMot {

  public static void main (String[] args) throws IOException {

      BufferedReader entree = new BufferedReader( XXXXXXXX );

      while ( XXXXXXXXX ) // boucle de lecture/affichage du fichier

      { .... }

    } // main()

} // class

1.2. La classe StringTokenizer

Rappel : Une des tâches de programmation assez fréquentes est d’avoir à faire l’analyse syntaxique d’un texte en mots ou en « unités lexicales » (en anglais, token). Ces unités sont séparées par un ensemble de délimiteurs. La classe StringTokenizer permet d’effectuer cette analyse.

Pour extraire un mot d’une ligne lue, nous allons utiliser la classe StringTokenizer du paquetage java.util.

1.3.1.      Consulter la documentation java de la classe StringTokenizer et plus particulièrement son constructeur et sa méthode nextToken().

1.3.2.      En reprenant le programme de la question 1.1.2, rajouter l’extraction des mots de chaque ligne lue, et leur affichage. Compiler et exécuter.

1.3. La classe Hashtable

Pour stocker les compteurs d’occurrences des mots, nous allons utiliser la classe Hashtable du paquetage java.util. Les clés seront les mots du texte, instances de la classe String (cette classe redéfinit les méthodes hashCode() et equals() pour les String). L'objet rangé selon une clé (un mot) sera une instance de la classe Integer donnant le nombre d'occurrences du mot associé.

1.3.1.      Consulter la documentation java de la classe Hashtable et plus particulièrement son constructeur sans argument et ses méthodes put(), get(), containsKey() et keys().

1.3.2.      En reprenant le programme de la question 1.2.2, rajouter le test de recherche du mot traité (clé) dans la table et l’incrémentation du compteur associé. Compiler et exécuter.

1.4. L’interface Enumeration

Pour parcourir la table de compteurs afin d’afficher les résultats, nous allons utiliser l’interface Enumeration du paquetage java.util.

1.4.1.      Consulter la documentation java de l’interface Enumeration et plus particulièrement ses méthodes hasMoreElement() et nextElement().

1.4.2.      En reprenant le programme de la question 1.3.2, rajouter l’affichage de tous les mots du texte et de leur nombre d’occurrences. Compiler et exécuter.

2.      Repérer les exceptions susceptibles d’être levées dans la classe CompterMot et les traiter.

3.      Rajouter dans la classe CompterMot, la création d’un fichier texte résultat sauvegardant les mots et leur nombre d’occurrences (le nom du fichier à créer sera donné en deuxième argument lors de l’exécution).

 

ANNEXE

 

// Graphe d’héritage de quelques classes du package java.io

java.lang.Object
  extended byjava.io.Writer
      extended byjava.io.PrintWriter
      extended byjava.io.OutputStreamWriter
          extended by java.io.FileWriter
java.lang.Object
  extended byjava.io.Reader
      extended byjava.io.BufferedReader
      extended byjava.io.InputStreamReader
          extended byjava.io.FileReader
 
 

 

// Quelques méthodes de la classe java.io.BufferedReader

 

public BufferedReader(Reader in);

public String readLine() throws IOException

public void close() throws IOException

 

 

// Quelques méthodes de la classe java.io.FileReader

 

public FileReader(String fileName) throws FileNotFoundException

 

 

// Quelques méthodes de la classe java.io.PrintWriter

 
public PrintWriter(Writer out)
public void println(String x)
public void close() throws IOException
 

 

 

// Quelques méthodes de la classe java.io.FileWriter

 

public FileWriter(String fileName) throws IOException

 

 

// Quelques méthodes de la classe java.util.StringTokenizer

 

public StringTokenizer(String str, String delim)
public boolean hasMoreTokens()
public String nextToken()

 

 

// Quelques méthodes de la classe java.util.Hashtable

 

public Hashtable();

public boolean containsKey(Object key);

public Object get(Object key);

public void put(Object key, Object value);

public void remove(Object key);

public Enumeration keys();