У меня есть задание в моем классе CS для старших классов, чтобы найти 15 наиболее часто встречающихся слов в большом текстовом файле (деревушка или мобы). Мы должны использовать ArrayLists, чтобы это сделать. После долгих размышлений я все еще сильно зациклен. Метод, который я написал, должен проверять слово в списке (которое сделано в другом месте в коде и содержит все слова в текстовом файле) против любого другого слова. Если он найден, добавьте в счетчик. Однако это не привязывает счет к слову. Здесь частотный метод:
public static void frequency(ArrayList<String> list){
int count = 0;
for(int i = 0; i < list.size(); i++){
for(int j = 0; j < list.size(); j++){
if(list.get(i).equals(list.get(j))){
count++;
}
}
}
}
Например, одна очевидная проблема может заключаться в том, что ваш метод ничего не возвращает и не меняет arraylist каким-либо образом (он использует только методы get()).
Первая строка в методе
int count = 0;
Затем вы прокручиваете арраист и увеличиваете счет с помощью count++, но вы никогда не возвращаете счет. Вы просто увеличиваете счет, но никогда не покидают функцию, потому что это локальная переменная, и она никогда не возвращается.
Дальше, с первым циклом "для", который вы, например, проверяете, первым индексом arraylist против каждого другого индекса в списке и приращением, когда совпадение найдено. Проблема в том, что когда первый цикл цикла увеличивает второй индекс и затем сравнивает этот индекс со всеми другими, он добавляет к переменной "count" еще больше. Таким образом, ваш счетчик переменных фактически представляет собой сумму количества копий слов в списке.
Хорошее усилие до сих пор, хотя так держать его.
Я предлагаю использовать HashMap<String, Integer>
.
Петля против всего предложения и добавьте целое число 1
к HashMap
для каждого слова, которое вы не можете найти в HashMap
. В противном случае увеличьте число в HashMap
соответствии со словом.
После сбора данных счетчика слов используйте метод Collection.sort
для сортировки HashMap
:
Collections.sort(entries, new Comparator<Map.Entry<K,V>>() {
@Override
public int compare(Entry<K, V> o1, Entry<K, V> o2) {
return o1.getValue().compareTo(o2.getValue());
}
});
И тогда ключи из первых 15 элементов в HashMap
- это слова, которые вы хотите.
HashMap
мог бы идеально подойти для этой задачи. Обратитесь к ответу CMPS тогда, нет проблем.
Вы можете создать 2 списка массивов, первое будет хранить слово, второе - для хранения счетчика.
ArrayList<String> listStr;
ArrayList<Integer> listCtr;
Скажем, у вас есть следующая строка: "Hello SO, Hello World"
Алгоритм
Петля в спискеStr, чтобы проверить, существует ли слово Hello
, если не добавить его, и добавить также 1 в списокCtr. Однако, если вы нашли слово, получите его индекс и listCtr
значение по этому индексу в listCtr
Повторяйте ту же процедуру, пока не достигнете EOF (конец файла).
В конце сортируйте arraylist listCtr (также убедитесь, что listStr также выполняет изменения при сортировке) и распечатывает последние 15 слов