Propuesto: Frecuencia de Tokens en un archivo

A partir del programa Cat.java construya un nuevo programa con nombre TokenFrec.java que cuente cuantas veces aparece cada palabra en un archivo.

El objetivo de este ejercicio es (i) practicar la navegación en la API de Java y (ii) ser capaz de utilizar clases provistas por Java para simplificar el desarrollo.

Separando los tokens

Para resolver el problema utilice la clase StringTokenizer que viene en el paquete java.util. Esta clase sirve para descomponer un string en tokens:

Para realizar el conteo de las apariciones de cada token utilice la clase Hashtable que viene en el paquete java.util. Esta clase permite crear tablas de asociación entre un string y un objeto cualquiera.

  Hashtable table= new Hashtable();
  table.put("juan", "Alameda 124");
  table.put("pedro", "Providencia 456");
Crea dos filas en la tabla: una para el string "juan" y otra para "pedro". El objeto que se asocia en cada caso es un string con la dirección que le corresponde a cada persona. El string "juan" se denomina la llave para acceder al string "Alameda 124".

Para determinar el objeto asociado a una llave se utiliza el método get:

  System.out.println( table.get("juan") ); // Alameda 124
  System.out.println( table.get("pedro") ); // Providencia 456
También se puede cambiar la dirección de pedro:

  table.put("pedro", "Grecia 789");
  System.out.println( table.get("pedro") ); // Grecia 789

Contando los tokens

El problema propuesto entonces se puede resolver asociando un contador a cada palabra encontrada en el archivo. Sin embargo, esto no es tan sencillo porque el objeto asociado no puede ser un tipo primitivo (un entero por ejemplo).

Afortunamente, java ofrece clases ``Wrapper'' para cada uno de los tipos primitivos. Por ejemplo, para los enteros existe la clase Integer:

Integer cinco= new Integer(5);
En este caso, la variable cinco referencia un objeto y por lo tanto sí puede ser el objeto asociado en una tabla:

table.put("hola", cinco);
...
Integer entero= (Integer)table.get("hola");
System.out.println(entero.intValue());
El cast (Integer) es importante porque el método get retorna un Object (no un Integer). El método intValue() permite recuperar el valor almacenado en un objeto de la clase Integer.