Частота слов в программировании жемчуга
-
02-10-2019 - |
Вопрос
В «Программировании жемчуга» я встретил следующую проблему. Вопрос в следующем: «печатные слова в порядке уменьшения частоты». Насколько я понимаю, проблема в этом. Предположим, есть заданный массив строк, давайте назовем это s
(Слова, которые я выбрал случайным образом, это не имеет значения),
String s[]={"cat","cat","dog","fox","cat","fox","dog","cat","fox"};
Мы видим, что строка «кошка» встречается 4 раза, «лиса» 3 раза и «собака» 2 раза. Таким образом, желаемый результат будет следующим:
cat
fox
dog
Я написал следующий код на Java:
import java.util.*;
public class string {
public static void main(String[] args){
String s[]={"fox","cat","cat","fox","dog","cat","fox","dog","cat"};
Arrays.sort(s);
int counts;
int count[]=new int[s.length];
for (int i=0;i<s.length-1;i++){
counts=1;
while (s[i].equals(s[i+1])){
counts++;
}
count[i]=counts;
}
}
}
Я отсортировал массив и создал массив подсчета, где я пишу количество случаев каждого слова в массиве.
Моя проблема заключается в том, что каким -то образом индекс элемента целочисленного массива и элемента массива строк не тот же. Как я могу печатать слова в соответствии с максимальными элементами целочисленного массива?
Решение
Чтобы отслеживать подсчет каждого слова, я использовал бы карту, которая отображает слово с текущим количеством.
String s[]={"cat","cat","dog","fox","cat","fox","dog","cat","fox"};
Map<String, Integer> counts = new HashMap<String, Integer>();
for (String word : s) {
if (!counts.containsKey(word))
counts.put(word, 0);
counts.put(word, counts.get(word) + 1);
}
Чтобы распечатать результат, пройдите ключи на карте и получите окончательное значение.
for (String word : counts.keySet())
System.out.println(word + ": " + (float) counts.get(word) / s.length);