Doble división comportándose incorrectamente

Tengo un HashMap llamado List wordFreqMap cuyo size es 234

 wordFreqMap = {radiology=1, shift=2, mummy=1, empirical=1, awful=1, geoff=1, .......} 

Quiero calcular el term frequency de cada palabra.

 term frequency = frequency of term / total number of terms public static Map getTFMap (Map wordFreqMap) { Map tfMap = new HashMap(); int noOfTerms = wordFreqMap.size(); Double tf; for (Entry word : wordFreqMap.entrySet() ) { tf = (double) ( word.getValue() / noOfTerms ); tfMap.put(word.getKey(), tf ); } return tfMap; } 

Mi problema es que, tfMap está volviendo {radiology=0.0, shift=0.0, mummy=0.0, empirical=0.0, awful=0.0, geoff=0.0, .....}

No entiendo por qué devuelve 0.0 por cada término. ¿Cómo lo arreglo?

Debería obtener algo como {radiology=0.00427, shift=0.00854, ...}

Está realizando una división de enteros y luego escribe casting:

 tf = (double) ( word.getValue() / noOfTerms ); ^-----integer division----^ 

Escriba lanzar uno de los elementos en la división para convertirlo en una división de punto flotante:

 tf = ((double)word.getValue()) / noOfTerms; 

Estás haciendo una división de enteros y luego lanzas esa respuesta a un doble. Lo que debes hacer es convertir uno de los dos valores en una doble inicial, y luego hacer la división en él. Eso debería darte la respuesta que deseas.

Integer/Integer es un Integer que se convierte en un Double , por lo que permanece como un Integer expandido a un Double .

Cambiarlo a

  tf = ( (double)word.getValue() / noOfTerms ); 

lo que estás haciendo es dividir un número entero por otro entero y luego intentar convertirlo en un doble. int / int es un int do aunque lo transfiera a un doble no obtendrá el valor real con decimales.

 int/int -> int 

Lo que debes hacer es lanzar word.getValue () o noOfterms para duplicar luego

 int/double -> double double/int -> double double/double -> double 

p.ej

  tf = (double)word.getValue()/noOfTerms; 

o

 tf = word.getValue()/(double)noOfTerms;