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).
// Graphe d’héritage de quelques classes du package java.io
java.lang.Object
java.io.Writer
java.io.PrintWriter
java.io.OutputStreamWriter
java.io.FileWriter
java.lang.Object
java.io.Reader
java.io.BufferedReader
java.io.InputStreamReader
java.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();