import java.util.StringTokenizer;
import java.util.Map;
import java.util.Collection;
import java.util.Iterator;
import java.util.AbstractMap;
import java.util.HashMap;

public class mapa extends HashMap
{
        /* Almacenaremos un mapa que tendra una palabra, y la cantidad de veces que aparece en el texto, además, un contador de palabras ingresadas */

        public HashMap llave;
        int elementos;

        /* El constructor vacio */

        public mapa()
        {
                this.llave = new HashMap();
                this.elementos = 0;
        }

        /* El constructor a partir de un mapa */

        public mapa(mapa m)
        {
                this.llave = m.llave;
                this.elementos = m.elementos;
        }

        /* El constructir a partir de un HashMap y el numero de elementos de este */
        public mapa(HashMap h)
        {
                this.llave = h;
                this.elementos = h.size();
        }

        /* Con este metodo procesamos una linea de texto separada por espacios en blancos y la metemos en un mapa */

        public void Procesatexto(String texto)
        {
                String aux=null;
                Integer i=null;

                /* Usamos un Tokenizer para separar la palabra en espacios */
                StringTokenizer st = new StringTokenizer(texto," ");
                while(st.hasMoreTokens())
                {
                        aux = st.nextToken();

                        /* Si la llave ya esta, tenemos que sumarle uno al numero de veces que sale esta palabra */
                        if(this.containsKey(aux))
                        {
                                i = (Integer)this.get(aux);
                                this.put(aux,new Integer(i.intValue()+1));
                        } else {
                                /* Si la llave no esta, simplemente la agregamos */
                                this.put(aux,new Integer(1));
                                this.elementos++;
                        }
                }
                return;
        }

        /* Este metodo nos entregara un iterador para poder correr sobre el mapa */
        public Iterator MakeIterator()
        {
                Collection col = null;
                Iterator iterator = null;

                /* Con values() obtenemos una coleccion y con la coleccion obtenemos el iterador */
                col = this.values();
                iterator = col.iterator();
                return iterator;
        }

        /* Este metodo nos dice cuantas palabras en total tengo en el mapa */

        public int calculaPalabras()
        {
                Integer in = null;
                int i = 0;
                Iterator iterator = this.MakeIterator();
                while(iterator.hasNext()) {
                        in = (Integer)iterator.next();
                        i += in.intValue();
                }
                return i;
        }

        /* Calcula la probabilidad de que una palabra se encuentre en el mapa */

        public double calculaFrecuencia(String x)
        {
                int totales = this.calculaPalabras();
                double prob = 0;
                if(this.containsKey(x))
                {
                        Integer aux = (Integer)this.get(x);
                        prob = aux.doubleValue() / (double) totales;
                }
                return prob;
        }
}