La moda de una distribución es el valor con mayor frecuencia de una distribución. Si hay dos valores de la distribución con la misma frecuencia, es decir, dos modas, dicha distribución será bimodal. Si hay tres modas será trimodal,… Si todos los valores tienen la misma frecuencia, entonces no hay moda.
Lo primero será definir nuestra distribución.
int[] elementos = {1,3,4,5,3,2,1,2,2,1,5,5,8,9,6,6,3,4,3,1,3,5,3};
Lo siguiente que vamos a hacer es recorrer la distribución e ir insertando en un Map con clave/valor el número de veces que aparece un valor en la distribución. La clave será el elemento de la distribución y el valor el número de veces que aparece.
Hay que tener en cuenta que si es la primera vez que aparece el número, habrá que inicializar dicha clave del Map con el valor de 1.
Map m = new HashMap();
for (int elemento: elementos){
if (m.containsKey(elemento))
m.put(elemento,m.get(elemento)+1);
else
m.put(elemento,1);
}
Como podemos ver en el código nos apoyamos en los métodos .put() y .get() del Map para añadir/consultar elementos, así como en el método .containsKey() para saber si el elemento está inicializado o no.
Una vez que tenemos nuestro Map cargado, vamos a recorrerlo para consultar cual es el elemento con mayor frecuencia. Como dijimos que podíamos tener varias modas utilizaremos un elemento List para ir guardando dichos valores y una variable repeticiones para saber cuál es el valor de mayor frecuencia.
int repeticiones = 0;
List moda = new ArrayList();
Pasamos a recorrer el Map utilizando una clase Entry que representa una dupla clave/valor.
Iterator> iter = m.entrySet().iterator();
Si la frecuencia del elemento del mapa es mayor que la actual, vaciamos la lista -.clear()-, insertamos el valor del elemento –.add()– e indicamos que esa frecuencia es la mayor. Si la frecuencia es igual, añadimos el elemento a la lista y si es menor, simplemente se descarta.
while (iter.hasNext()) {
Entry e = iter.next();
if (e.getValue() > repeticiones) {
moda.clear();
moda.add(e.getKey());
repeticiones = e.getValue();
} else if (e.getValue() == repeticiones)
moda.add(e.getKey());
}
Ya solo nos quedará comprobar que el número de modas no es igual al número de elementos de la distribución, ya que en ese caso no habrá moda. Si no, simplemente volcamos los elementos de la moda.
if (moda.size() == elementos.length)
System.out.println("No hay moda");
else
System.out.println("La moda de la distribución es " + moda);