Найдите 15 самых частых слов в текстовом файле - java

1

У меня есть задание в моем классе 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++;
        }
     }
  }
}
  • 2
    Чрезвычайно широкий вопрос и недостаточно информации о том, где конкретно вы застряли, каков конкретный ожидаемый результат. Мы не можем просто перепроектировать весь код для вас. Это великолепный код и все. Подумайте о том, чтобы вернуться с целевыми вопросами, подробностями и подробностями, а также с количеством кода, необходимого для того, чтобы понять, как ответить на вопрос.
  • 0
    Извините, это мой первый вопрос на этом сайте. Так что я застрял на частотном методе внизу. Я ищу большой текстовый файл (деревня) и мне нужно найти 15 наиболее часто встречающихся слов. Я не знаю, как это сделать. Я редактировал пост выше
Показать ещё 8 комментариев
Теги:
arraylist

3 ответа

1

Например, одна очевидная проблема может заключаться в том, что ваш метод ничего не возвращает и не меняет arraylist каким-либо образом (он использует только методы get()).

Первая строка в методе

int count = 0;

Затем вы прокручиваете арраист и увеличиваете счет с помощью count++, но вы никогда не возвращаете счет. Вы просто увеличиваете счет, но никогда не покидают функцию, потому что это локальная переменная, и она никогда не возвращается.

Дальше, с первым циклом "для", который вы, например, проверяете, первым индексом arraylist против каждого другого индекса в списке и приращением, когда совпадение найдено. Проблема в том, что когда первый цикл цикла увеличивает второй индекс и затем сравнивает этот индекс со всеми другими, он добавляет к переменной "count" еще больше. Таким образом, ваш счетчик переменных фактически представляет собой сумму количества копий слов в списке.

Хорошее усилие до сих пор, хотя так держать его.

  • 0
    Спасибо за разъяснение этого! Все еще работаю над этим...
  • 0
    Эй, нет проблем. Хотелось бы, чтобы я знал столько же, сколько и ты о программировании, когда был в твоем возрасте!
0

Я предлагаю использовать 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 - это слова, которые вы хотите.

  • 0
    Дело в том, что мы еще не изучили HashMaps в классе. Я понимаю, что это лучший способ, как говорили многие люди, но я не могу его использовать! Это отстой :( Спасибо за помощь, хотя!
  • 0
    Хорошо, HashMap мог бы идеально подойти для этой задачи. Обратитесь к ответу CMPS тогда, нет проблем.
0

Вы можете создать 2 списка массивов, первое будет хранить слово, второе - для хранения счетчика.

ArrayList<String> listStr;
ArrayList<Integer> listCtr;

Скажем, у вас есть следующая строка: "Hello SO, Hello World"

Алгоритм

Петля в спискеStr, чтобы проверить, существует ли слово Hello, если не добавить его, и добавить также 1 в списокCtr. Однако, если вы нашли слово, получите его индекс и listCtr значение по этому индексу в listCtr

Повторяйте ту же процедуру, пока не достигнете EOF (конец файла).

В конце сортируйте arraylist listCtr (также убедитесь, что listStr также выполняет изменения при сортировке) и распечатывает последние 15 слов

  • 1
    Спасибо! Это очень полезно!
  • 0
    @ Даниэль Нет проблем :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню