Вычисление процента значений карты


Я написал программу, которая подсчитывает количество вхождений всех букв в заданную строку, используя TreeMap(String, Integer) (название alphaFreq). Теперь я хочу представить эти вхождения в процентах ([A=12.3] , [B=3.0] , ....и т. д.), поэтому я создал еще один TreeMap (String, Double) (названный процентом), скопировал все ключи с их значениями установить на ноль и отредактировать значение в соответствии с alphaFreq следующим образом:

for(int i=0; i<26; i++){
   int temp;
   Character current = (char)(i+65);
   String frog = current.toString();
   temp = alphaFreq.get(frog);
   int perc = (temp/cipherLetters.length)*100;
   System.out.println(temp+"/"+cipherLetters.length+" = "+perc);
   percentage.put(frog,(double)perc);
}

Если вся строка состоит из As или B, результатом будет то, что все ключи имеют нулевое значение, кроме A=100.0 или B=100.0. Но если текст строки имеет любую другую комбинацию (скажем: DDJJSHHIEM), все они имеют нулевое значение. Почему? Что я делаю не так?................Спасибо


person Aelgawad    schedule 04.05.2013    source источник


Ответы (1)


Первое, что я бы сделал, это изменил ваш расчет процентов на:

int perc = (temp * 100)/cipherLetters.length;

Учитывая, что вы используете целочисленное деление, (temp/cipherLetters.length), вероятно, равно zero.

person jarmod    schedule 04.05.2013
comment
Пожалуйста. Не забудьте нажать на галочку для правильных ответов, чтобы другие знали, что проблема решена. Кроме того, если вам нужно, чтобы ваш процент был более точным (например, 63,5%, а не округляется до 63%, как сейчас), вам нужно будет использовать float, а не int. - person jarmod; 04.05.2013
comment
Я сделал его удвоенным один раз и плавающим один раз, но он дает 16,0 или 63,0, когда должно быть 16,667 или 63,533. Есть мысли? - person Aelgawad; 05.05.2013
comment
Вам придется сделать больше, чем просто изменить «int perc» на «float perc». В правой части вашего задания по-прежнему используется целочисленная арифметика, поэтому выполняется округление. Попробуйте 'float perc = ((float)temp * 100.0f) / (float)cipherLetters.length;' - person jarmod; 05.05.2013
comment
Ухааа, похоже, мне нужен урок в этом деле. Последний вопрос. Есть ли способ округлить его до одного десятичного знака (12,4) вместо 6 знаков после запятой? - person Aelgawad; 05.05.2013
comment
См. stackoverflow.com /вопросы/11701399/ - person jarmod; 06.05.2013