/* * program: Frequency.java * auteur: felipe@ift2030 * date: 16/08/2002 * * objet: compter des frequences de mots en Java et afficher les mots * rencontres par ordre croissant de frequence. * * Utilisation des collections de la librairie standard: * une hashmap associant un mot a sa frequence * un vecteur d'iterateur pour ensuite trier la hashmap avant * affichage (sinon sortie par ordre lexicographique) * * lire le fichier readme pour plus d'information * sur le format des entrees lues depuis l'entree standard * * Compilation: javac Frequency.java * Exemple d'execution: cat corpus-1 | java Frequency */ import java.io.*; import java.util.*; /* * Une classe speciale qui contient juste un entier car * - les collections ne manipulent que des references sur des objets * - la classe Integer ne permet pas de changer la valeur de l'entier code * ca dont on a besoin pour ne pas avoir a creer un objet a chaque MAJ */ class FreqCount { private int count; public FreqCount(int value) {count = value;} public FreqCount() {count = 1;} public void inc() {count++;} // les deux suivantes ne sont pas necessaires au programme // mais qui peut le plus peut le moins public int getValue() {return count;} public void setValue(int value) {count=value;} public int compareTo(FreqCount f) { if (count > f.count) return -1; if (count == f.count) return 0; return 1; } // lecon de morale: tjs et tjs ecrire un toString adapte a chaque classe public String toString() {return count+"";} } /* * classe pour le tri */ class FeTri implements Comparator { public int compare(Object o1, Object o2) { Map.Entry r1 = (Map.Entry)o1; Map.Entry r2 = (Map.Entry)o2; int res = ((FreqCount) r2.getValue()).compareTo((FreqCount) r1.getValue()); if (res == 0) res = ((String)r1.getKey()).compareTo(r2.getKey()); return res; } } /* * La classe principale */ class Frequency { static boolean verbose = true; public static void main (String args []) { int sent = 0; int mots = 0; HashMap frequences = new HashMap(50000); String line; FreqCount freq; Iterator it; try { BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); while ((line = in.readLine()) != null) { if ( line.compareTo("{sent}") == 0) sent++; else { if ((freq = (FreqCount) frequences.get(line)) == null) frequences.put(line, new FreqCount(1)); // nouveau mot => freq=1 else freq.inc(); // deja la => freq++ } // un mot } // while ligne a lire } // try catch (IOException e) { System.err.println("Probleme de lecture sur stdin"); } /* * Trie selon la frequence */ Vector vec = new Vector(frequences.entrySet()); Collections.sort(vec,new FeTri()); /* * affichage des mots par ordre decroissant */ it = vec.iterator(); while (it.hasNext()) { Map.Entry ref = (Map.Entry) it.next(); System.out.println(ref.getKey() + "\t\t" + (FreqCount) ref.getValue()); mots += ((FreqCount) ref.getValue()).getValue(); } if (verbose) System.err.println("Phrases lues: " + sent + " Mots lus: " + mots + " Mots differents: " + vec.size()); } // main } // class