Download Segunda aproximación

Document related concepts
no text concepts found
Transcript
2ª aproximación
Además del reader para words anterior se genera una clase para almacenar todos los datos recogidos (pares palabra-cuenta) en un
array para servirnos de las rutinas de ordenación. El programa de test se altera para admitir ordenaciones.
WordCountArray
import java.util.*;
import java.text.*;
public class WordCountArray {
private class Wc {int c; String w; private Wc(int c, String w) {this.c=c; this.w=w;}}
private class Sbc implements Comparator {
public int compare(Object o1, Object o2) {
return (((Wc)o1).c<((Wc)o2).c)?1:(((Wc)o1).c>((Wc)o2).c)?-1:0;
}
}
private class Sbw implements Comparator {
private Collator myCollator=Collator.getInstance();
public int compare(Object o1, Object o2) {
return myCollator.compare(((Wc)o1).w,((Wc)o2).w);
}
}
private Wc lista[];
public WordCountArray(Map m) {
lista=new Wc[m.size()];
Iterator it=m.keySet().iterator();
int i=0;
while (it.hasNext()) {
String s=(String)it.next();
lista[i++]=new Wc(((Integer)m.get(s)).intValue(),s);
}
}
public String toString(){
StringBuffer sb=new StringBuffer();
for (int i=0;i<lista.length;i++)
sb.append(lista[i].c+"\t"+lista[i].w+System.getProperty("line.separator"));
return sb.toString();
}
public void sortByCount(){
Arrays.sort(lista,new Sbw());
Arrays.sort(lista,new Sbc());
}
public void sortByWord(){
Arrays.sort(lista,new Sbc());
Arrays.sort(lista,new Sbw());
}
public int size(){return lista.length;}
}
NgramV2
import java.io.*;
import java.util.*;
public class NGramV2 {
private static TreeMap lista=new TreeMap();
private static final Integer UNIDAD=new Integer(1);
public static void main(String[] args) throws IOException{
boolean sortByWord=false;
WordReader wr=null;
//Gestion de argumentos
if (args.length==1) wr=new WordReader(new FileReader(args[0]));
else if (args.length==2 && args[0].equals("c")) {
wr=new WordReader(new FileReader(args[1]));
}
else if (args.length==2 && args[0].equals("w")) {
wr=new WordReader(new FileReader(args[1]));
sortByWord=true;
}
else
{
System.err.println("Formato: java NGramV2
System.exit(0);
}
{-|c|w} <fichero>");
//Lectura del texto construyendo el TreeMap
String w;
while ((w=wr.readWord())!=null) {
w=w.toLowerCase();
if (lista.containsKey(w))
lista.put(w,new Integer(((Integer)lista.get(w)).intValue()+1));
else lista.put(w,UNIDAD);
}
//info de tamaños
System.out.println("Número de palabras: "+wr.getContador()
+System.getProperty("line.separator")
+"Tamaño del vocabulario: "+lista.size()
+System.getProperty("line.separator")
+"-------------------------------------------"
);
//Nos deshacemos del TreeMap para trabajar con una clase basada en un array
WordCountArray wca=new WordCountArray(lista); lista=null;
//Muestra de la lista ordenada por el criterio pedido
if (sortByWord)wca.sortByWord(); else wca.sortByCount();
System.out.println(wca);
}
}